Wenn ein Prozess abgeschlossen ist (entweder weil er beendet oder durch ein Signal beendet wird), werden alle Dateien und Verbindungen, die er offen hält, automatisch vom Betriebssystem geschlossen. Es wird nicht sauber geschlossen, indem das MySQL-Protokoll zum Schließen von Verbindungen verwendet wird (vorausgesetzt, es gibt eine). Es wird einfach auf TCP/IP-Ebene gelöscht und der Server auf der anderen Seite entdeckt einfach, dass er mit einer geschlossenen Tür spricht. Das geht nicht immer sofort, manchmal dauert es etwas, bis der Server merkt, dass der Gesprächspartner weg ist. Wenn dies passiert, betrachtet es die Verbindung als getrennt und bereinigt die Dinge auf seiner Seite.
Nicht Öffnen Sie die MySQL-Verbindung im übergeordneten Prozess, bevor Sie fork()
verwenden . fork()
dupliziert die Datenstrukturen, die zum Verwalten der lokalen Seite der Verbindung verwendet werden, und die Ergebnisse sind unvorhersehbar. Mehr noch, wenn der untergeordnete Prozess abgeschlossen ist (egal wie), schließt er die Verbindung (oder das Betriebssystem bricht sie ab), der MySQL-Server schließt ebenfalls sein Ende und der übergeordnete Prozess entdeckt, dass er mit niemandem spricht.
Schließen Sie die MySQL-Verbindung im übergeordneten Prozess, bevor Sie fork()
verwenden Öffnen Sie dann nach Bedarf separate Verbindungen im Eltern- und im Kindprozess.
Schließen Sie außerdem jede MySQL-Kommunikation mit dem Server im übergeordneten Prozess ein zwischen:
pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));
und
pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));
Andernfalls wird der Elternprozess mit dem SIGCHLD
benachrichtigt, wenn ein untergeordneter Prozess abgeschlossen ist Signal. Ein empfangenes Signal reaktiviert es aus dem Ruhezustand (falls es zufällig in einem sleep()
angehalten wurde anrufen, wenn das Signal ankommt). Die MySQL-Bibliothek verwendet sleep()
als Teil des MySQL-Protokolls für die Kommunikation mit dem Server. Wenn so ein sleep()
zwangsweise früher zurückkehrt, als es sollte (aufgrund eines empfangenen Signals), wird die MySQL-Bibliothek verwirrt und meldet am Ende seltsame Fehler (wie "MySQL-Server ist weg"), die eigentlich nicht korrekt sind.
Sehen Sie sich diese Antwort an für eine ausführliche Erklärung.