プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (1件)

 親プロセスと子プロセスで同一のコネクションを使用している所に問題があると思います。



$connect = mysql_pconnect("localhost", "user", "password");

//parent
if ($pid = pcntl_fork()) {


//child
} else {
$connect = mysql_pconnect("localhost", "user", "password");


exit(0);
}

 と、子プロセスは子プロセス側で別途コネクトして使用するか、
 親、子、それぞれでDBにコネクトする必要があるかと思います。
    • good
    • 0
この回答へのお礼

子プロセスで使いまわすことはできないのですね。
ありがとうございました。

お礼日時:2007/10/07 15:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!