gpt4 book ai didi

php - Laravel 5 并发请求和预定作业

转载 作者:可可西里 更新时间:2023-11-01 07:01:16 25 4
gpt4 key购买 nike

我正在使用 Laravel 5php 5.5.9-1ubuntu4.14mysql 5.5.47。我有一个 Multi-Tenancy 环境,每个租户都有一个单独的数据库。因此,对于每个 HTTP 请求,我都在 BeforeMiddleware 中设置适当的数据库连接,如下所示

public function handle($request, Closure $next)
{
...
// Set the client DB name and fire it up as the new default DB connection
Config::set('database.connections.mysql_client.host', $db_host);
Config::set('database.connections.mysql_client.database', $db_database);
Config::set('database.connections.mysql_client.username', $db_username);
Config::set('database.connections.mysql_client.password', $db_password);
DB::setDefaultConnection('mysql_client');
...
}

即使对于并发 HTTP 请求,这也能正常工作。

但现在我想将预定作业添加到我的应用程序中。这些作业将向属于所有租户的用户发送通知。所以,我再次需要连接到各自的租户数据库。但此连接不会通过 HTTP 请求。假设我有一个 CommunicationController 和一个用于发送通知的函数。

public function sendNotification()
{
...
DB::purge('mysql_client');//IMP
// Set the client DB name and fire it up as the new default DB connection
Config::set('database.connections.mysql_client.host', $db_host);
Config::set('database.connections.mysql_client.database', $db_database);
Config::set('database.connections.mysql_client.username', $db_username);
Config::set('database.connections.mysql_client.password', $db_password);

DB::setDefaultConnection('mysql_client');
...
}

这是我设置 Config 值的地方。此函数将通过 Laravel Scheduler 每分钟执行一次。

我的问题是:

  • 当收到 HTTP 请求时会发生什么?会不会有在 HTTP 请求和计划作业中都设置了 Config 参数的并发问题?
  • 如果 HTTP 请求与预定作业同时运行,是否会连接到一些不正确的数据库?

最佳答案

根据Laravel docs :

Configuration values that are set at run-time are only set for the current request, and will not be carried over to subsequent requests.

当您专门调用 Config::set 方法时,配置值是在运行时设置的,因此该值将仅对当前请求有效,并且您永远不会遇到任何并发问题那个。

你的第二个问题也是不可能的。即使您之前的任务是在数据库上运行请求,第二个/后续任务也会等待锁定(如果有的话)在数据库上释放。您应该尝试通过使用多插入、sqldump(如果您正在执行大型查询)等来确保您没有执行任何可以在您的数据库上长时间锁定的查询。

关于php - Laravel 5 并发请求和预定作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38472695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com