2010-09-08 4 views
15

Ich habe eine foreach-Schleife, die sich darin verzweigt. Nach dem Prozess greift er auf die Datenbank zu. Ich erhalte eine Fehlermeldung:pcntl_fork und die MySQL-Verbindung ist weg

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 

Die Sache ist, ich bin der Verbindung zur Datenbank nach ich gegabelt haben.

Meine Frage: Warum würde das passieren?

Wenn dies passiert, bin ich tatsächlich Zugriff auf die Datenbank vor forking? Wird das Kind DB-Verbindungen erben?

(Hinweis: Ich kann Code schreiben, aber es ist ziemlich groß, da es alles in Klassen ist, was meine Verwirrung beim Zugriff auf die DB verursachen könnte. Eine andere Sache, die Sie wissen sollten, ist, dass ich ZF benutze .)

+0

Ich habe nicht mit Zend Framework gespielt, aber ich frage mich, ob es eine Art von internen Pooling von Datenbankverbindungen hält. Oder macht es vielleicht dauerhafte Verbindungen? Ansonsten sollten Kinder keine DB-Verbindungen oder irgendetwas anderes erben, da es sich um verschiedene PHP-Prozesse handelt. – Fanis

+0

Ack, ich stehe korrigiert. Meine obige Antwort basierte auf Intuition, aber nicht auf persönlicher Erfahrung, da dies noch nicht erforderlich war. Lesen mehr in es sehe ich gegabelten Kinder erben die DB Verbindung ihrer Eltern, und es ist ein bekanntes Problem: http://www.php.net/manual/en/function.pcntl-fork.php#70721 – Fanis

+0

@Fanis - Can Sie machen Ihren letzten Kommentar zu einer Antwort, damit ich auf den großen grünen Haken klicken kann? Danke für das Ausgraben dieser Info. Ich werde nicht forkieren, stattdessen werde ich einen neuen Prozess ausführen, der seine eigene db Verbindung hat. Es wird dann verzweigen, um den aufrufenden Prozess nicht zu binden, und dann wird es in dem Kind ausgeführt, protokolliert es in einem Protokoll, dass ein anderer Cron-gestarteter Prozess mitkommen wird und überprüfen wird, ob es abgeschlossen wurde. Hmmmm ... Es könnte diesmal nur funktionieren! Vielen Dank! –

Antwort

13

(Kommentar -> Antwort per Anfrage

senden)

db Lese Verbindung der Eltern mehr in sie ich sehe gegabelt Kinder erben, und es ist ein bekanntes Problem: http://php.net/manual/en/function.pcntl-fork.php#70721

+0

Ich dachte nur, ich würde klarstellen: Der Grund, warum ich den Fehler bekam, obwohl das Kind die DB-Verbindung geerbt hat, ist, dass ich eine Reihe neuer Prozesse abzweige, die alle eine DB-Verbindung benötigen. –

2

Außer es ist kein Problem. So wurde pcntl_fork entwickelt. Jede Erweiterung (wie die Dokumentation eindeutig angibt), die ihre eigenen Dateideskriptoren beibehält, wird dann Deskriptoren beschädigt haben, da alle Kinder und Eltern dieselben Dateideskriptoren haben.

0

Sie Schlussverbindung vermeiden können, wenn Prozess-Exit-gegabelt, wenn Sie Prozess mit SIGKILL gegabelt töten.

Der Grund für dieses Verhalten, dass, wenn PHP-Prozess beendet wird, als PHP sendet an den Datenbankserver Befehl "Verbindung beenden". Der Socket wird jedoch nur dann vom System geschlossen, wenn alle Verbindungen zum Socket geschlossen sind. Die Verwendung von SIGKILL hilft uns dabei, den Befehl "Verbindung beenden" nicht an den Datenbankserver zu senden.

Verwandte Themen