[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 メーリングリストの案内