プロセスが完了すると(プロセスが終了するか、シグナルを使用して終了するため)、開いたままのすべてのファイルと接続がオペレーティングシステムによって自動的に閉じられます。接続を閉じるためにMySQLプロトコルを使用することにより、クリーンに閉じられません(接続が存在する場合)。 TCP / IPレベルでドロップするだけで、反対側のサーバーは閉じたドアと通信していることを検出します。これは常にすぐに発生するとは限りません。サーバーがディスカッションパートナーがいなくなったことに気付くまでに時間がかかる場合があります。これが発生すると、接続が切断されたと見なされ、その側の処理がクリーンアップされます。
しないでください fork()
を使用する前に、親プロセスでMySQL接続を開きます 。 fork()
接続のローカル側を管理するために使用されるデータ構造を複製し、結果は予測できません。さらに、子が(どのようにでも)完了すると、接続を閉じ(またはOSが接続を切断し)、MySQLサーバーもその終了を閉じ、親プロセスはそれが誰とも通信していないことを検出します。
fork()
を使用する前に、親プロセスでMySQL接続を閉じてください 次に、必要に応じて、親プロセスと子プロセスで別々の接続を開きます。
また、次の間の親プロセスでサーバーとのMySQL通信をラップします。
pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));
および
pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));
それ以外の場合、子プロセスが完了すると、親プロセスにSIGCHLD
が通知されます。 信号。受信した信号はスリープを再開します(sleep()
で停止した場合 信号が到着したときに呼び出します)。 MySQLライブラリはsleep()
を使用します サーバーと通信するためのMySQLプロトコルの一部として。そのようなsleep()
(信号を受信したために)必要以上に早く強制的に戻ると、MySQLライブラリが混乱し、実際には正しくない奇妙なエラー(「MySQLサーバーがなくなった」など)が報告されることになります。
この回答 をご覧ください 詳細な説明については。