首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5并发请求和计划作业

Laravel 5并发请求和计划作业
EN

Stack Overflow用户
提问于 2016-07-20 05:04:54
回答 2查看 959关注 0票数 5

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

代码语言:javascript
复制
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和一个函数来发送通知。

代码语言:javascript
复制
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请求与计划作业同时运行,它会连接到某些不正确的DB吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-22 17:59:37

查看Illuminate\Config\Repository,它是用于Config外观的实现,特别是set方法

代码语言:javascript
复制
public function set($key, $value = null)
{
    if (is_array($key)) {
        foreach ($key as $innerKey => $innerValue) {
            Arr::set($this->items, $innerKey, $innerValue);
        }
    } else {
        Arr::set($this->items, $key, $value);
    }
}

您可以放心,这个集合不是IO集(即。(文件系统)但是内存中的集。因此,每分钟运行的CLI调度程序命令将像其他每个http请求一样在自己的上下文中运行。

票数 4
EN

Stack Overflow用户

发布于 2016-07-27 11:07:30

根据Laravel docs

在运行时设置的配置值仅为当前请求设置,不会传递到后续请求。

配置值是在特定调用Config::set方法时在运行时设置的,因此该值仅对当前请求有效,因此不会出现任何并发问题。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38472695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档