2016-07-20 6 views
4

Я использую Laravel 5 с php 5.5.9-1ubuntu4.14 и mysql 5.5.47. У меня есть многопользовательская среда с каждым арендатором, имеющим отдельную БД. Таким образом, для каждого запроса HTTP, я установил соответствующее соединение DB в BeforeMiddleware как такLaravel 5 одновременный запрос и запланированная работа

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 приходит? Будут ли возникать проблемы с параллелизмом , поскольку параметры Config устанавливаются как в HTTP-запросе, так и в задании по расписанию?
  • Будет ли HTTP-запрос подключаться к некорректной БД, если он работает одновременно с запланированным заданием?

ответ

3

Глядя на Illuminate\Config\Repository, который является реализация используется для Config фасада и, в частности метод set

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-запрос.

5

Согласно Laravel docs:

значение конфигурации, которые установлены во время выполнения устанавливается только для текущего запроса , и не будет перенесен на последующие запросы.

значение конфигурации устанавливается во время выполнения, когда вы специально вызвать метод Config::set поэтому значение будет действительно только для этого текущего запроса, и вы никогда не будете иметь никаких проблем параллелизма из-за этого.

Ваш второй вопрос невозможно. Даже если ваша предыдущая задача выполняла запрос в базе данных, вторая/последующая задача будет ждать блокировок, если они будут выпущены в базе данных. Вы должны быть уверены, что не выполняете никаких запросов, которые могут долгое время блокироваться в вашей БД, используя multi-insert, sqldump (если вы выполняете большие запросы) .. и т. Д.

+0

Да, я знаю что значения Config установлены только для текущего запроса. Но я полагал, что это правда только для HTTP-запросов. Мой вопрос состоял в том, что произойдет, когда HTTP-запрос и запланированная команда будут выполняться одновременно. Но теперь ясно. Если посмотреть на код, я уверен, что не будет проблем с параллелизмом. – linuxartisan