[PHP-users 25228] Re: cli をデーモンとして使用する際の注意

Ryuzo KOSAKI kosaki @ fip.fujitsu.com
2005年 3月 31日 (木) 17:23:28 JST


こんにちは、こさきです。

"[PHP-users 25215] Re: cli をデーモンとして使用する際の注意" の記事において 
komura @ ma9.seikyou.ne.jpさん は書きました。

>OS や PHP のバージョンなどの環境の問題もあるのかもしれません。
>また、PHP マニュアルの User Contributed Notes には、pcntl_fork() の前に
>MySQL のリソースを解放すべきという投稿もあります。

>どうやら、子プロセスの終了時に、データベースへの接続を解放してしまい、
>次の接続が失敗してエラーが発生するようです。

fork()した場合、リソースも複製されるのでそれまでの接続が混乱
してしまうことがあります(混乱というのはヘンですが、いい用語を
思い付かない)。
ただ、子がDBMSと通信しているときに親は何もせず、子が終了する
ときにmysql_close()のようなことをやらなければ、処理は続行でき
るかもしれません。うまく行くときと行かないときの差はここにあ
るのかも。

socket通信を行なう典型的なサーバのプログラムだとこんな感じに
やっています。

while (TRUE) {
  $soc2 = stream_socket_accept($soc); //connect待ち
  // エラー処理省略
  $pid = pcntl_fork();
  if ($pid === -1) {
    die("pcntl_fork() error);
  }
  elseif ($pid) {
    // 親は新しいsocketをcloseして待ちに戻る
    fclose($soc2);
    continue;
  }
  else {
    fclose($soc);
    // $soc2に対する子プロセスのいろんな処理
    exit(0);
  }
}
// ※子プロセスの処理は pcntl_signal() のハンドラで
//  pcntl_waitpid()を実行

この場合でも、$soc2のIDは増え続けるんですね。リソースは開放
されていたとしても、ちょっと、キモチ悪い。



PHP-users メーリングリストの案内