子プロセス終了で閉じてしまうmysqlコネクション
pcntl_fork()を利用して、子プロセスでファイル収集を行い、親プロセスがそのファイルを解析してDBへ登録するといった単純な2並列のプログラムを書いています。
ところが子プロセスが終了した時点でどうもmysqlのコネクションが切れてしまうようなのです。
以下は上記内容を再現した簡易コードです。
$connect = mysql_pconnect("localhost", "user", "password");
//parent
if ($pid = pcntl_fork()) {
// 本当はここで収集されたファイルを順次解析してDBに登録を行う。
sleep(5); // 子が先に終了するように時間差を。
mysql_query($query="use testdb",$session) || die(sprintf("%s : %s\n", $query, mysql_error()));
pcntl_wait($status);
//child
} else {
// 本当はここでファイルを収集する
sleep(1);
exit(0);
}
上記コードは以下のエラーを吐いて終了します。
use testdb : MySQL server has gone away
mysql_pconnectの代わりにmysql_connectを使ったり、mysql_queryの第二引数に$connectを与えても結果は変わりません。
子プロセスが終了してもmysqlとのコネクションを維持しておきたいのですが解決策はあるでしょうか。
ちなみにPHP CLIで実行しています。
OS: Linux
PHP 5.2.4
お礼
ありがとうございます。 説明があまりにもたりませんでしたね バックエンドDBはPostgrsSQLなんですけど 当然のように コネクション数は、PostgreSQLの場合ある程度設定できて十分に でかくして、それにあわせてphplibのDBコネクション数をきめてるんですけど 問題はそこににもCPUパワーにもなくて。 単純にPHPがコネクションを開放しないで、だんだんとコネクションが たまっちゃうんですよね。特にデフォルトがpconnctなもんで その傾向が・・・・postgreの実装とかみあわないのかな? perlでセッション管理してたときは 毎回強制でコネクションきっていて、理論上不可は高かったんだけど それのときははるかに少ないコネクション数の設定(DB側)でも オーバーすることなかったから。う~~んどないなってんだろ・・・ しばらくソースを追うたびに出ようかな ちなみにバージョンはphp3.0.18-ja phplib-7.2c postgre 7.0.3