2016-07-20 12 views
4

Ich verwende Laravel 5 mit php 5.5.9-1ubuntu4.14 und mysql 5.5.47. Ich habe eine Multi-Tenant-Umgebung mit jedem Mandanten mit einer separaten DB. So wird für jede HTTP-Anforderung, habe ich die entsprechende DB-Verbindung in den BeforeMiddleware wie soLaravel 5 gleichzeitige Anfrage und geplanter Job

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'); 
... 
} 

Dies richtig, auch für die gleichzeitigen HTTP-Anforderungen funktioniert.

Aber jetzt möchte ich geplante Anwendungen zu meiner Anwendung hinzufügen. Diese Jobs senden Benachrichtigungen an Benutzer, die zu allen Mietern gehören. Daher muss ich mich erneut mit den entsprechenden Mandanten-Datenbanken verbinden. Diese Verbindung wird jedoch nicht über eine HTTP-Anfrage hergestellt. Nehmen wir an, ich habe eine CommunicationController und eine Funktion darin, um Benachrichtigungen zu senden.

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'); 
    ... 
} 

Dies ist, wo ich die Config Werte gesetzt. Diese Funktion wird jede Minute über Laravel Scheduler ausgeführt.

Meine Fragen sind:

  • Was passiert, wenn eine HTTP-Anforderung kommt? Gibt es Nebenläufigkeit Probleme wie Config Parameter werden sowohl in HTTP-Anfrage als auch geplante Job gesetzt?
  • Stellt die HTTP-Anfrage eine Verbindung zu einer falschen DB her, wenn sie gleichzeitig mit dem geplanten Job ausgeführt wird?

Antwort

3

bei Illuminate\Config\Repository der Suche, welche die Implementierung für die Config Fassade und speziell die set Methode

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); 
    } 
} 

Sie, dass die Menge sichergestellt werden kann, verwendet wird, ist nicht ein IO-Satz (dh. In das Dateisystem), aber ein In-Memory-Set. Der CLI-Scheduler-Befehl, der jede Minute ausgeführt wird, wird also wie jede andere HTTP-Anforderung in seinem eigenen Kontext ausgeführt.

5

Nach den Laravel docs:

Konfigurationswerte, die zur Laufzeit festgelegt werden nur für die aktuelle Anforderung eingestellt und wird nicht auf nachfolgende Anforderungen übertragen werden.

Konfigurationswerte werden zur Laufzeit festgelegt, wenn Sie die Config::set Methode speziell nennen so dass der Wert für die aktuelle Anforderung nur dann gültig sein wird, und Sie haben nie Concurrency Probleme aufgrund der.

Ihre zweite Frage ist ebenfalls unmöglich. Selbst wenn Ihre vorherige Aufgabe eine Anforderung für die Datenbank ausgeführt hat, warten die zweiten/nachfolgenden Aufgaben auf Sperren, wenn diese in der Datenbank freigegeben werden sollen. Sie sollten versuchen, sicher zu sein, dass Sie keine Abfragen ausführen, die für eine lange Zeit in Ihrer Datenbank sperren können, indem Sie multi-insert, sqldump verwenden (wenn Sie große Abfragen ausführen) .. etc

+0

Ja, mir ist bekannt Diese Konfigurationswerte werden nur für die aktuelle Anfrage festgelegt. Aber ich war der Meinung, dass dies nur für HTTP-Anfragen zutrifft. Meine Frage war, was passieren würde, wenn eine HTTP-Anfrage und ein geplanter Befehl gleichzeitig ausgeführt werden. Aber jetzt ist es klar. Wenn ich mir den Code anschaue, bin ich sicher, dass es keine Nebenläufigkeitsprobleme geben wird. – linuxartisan