2010年6月25日

[PHP-users 35255]php cli版での常駐プログラムとメモリ開放について

増田と申します。

http://ml.php.gr.jp/pipermail/php-users/2005-March/025513.html
こちらを参考にphpで常駐させるプログラムを作ったのですが、
案の定子プロセスが増え続け、メモリを使い果たし、
サーバが落ちてしまいました。。。

具体的には、


background.php
------------------------
<?php
exec ("/usr/bin/php /root/test/loop.php > /dev/null &");
print "ok";

?>
------------------------

として、loop.phpをバックグランドで常駐させるようにし、
loop.phpでは、上記URLでの議論をもとに子プロセスを生成し、
whileとsleepで無限ループさせています。


loop.php
------------------------
#!/usr/bin/php
<?php

while ( 1 ) {
$pid = pcntl_fork();
if ( $pid === -1 ) {
exit;
}
else if ( $pid ) {
// 親プロセス
pcntl_waitpid( -1, $status, WUNTRACED );
}
else {
// 子プロセス

try {
$dbObj = new PDO(DBの設定);
$datas = $dbObj->query("SELECTでDBのデータとってくる")->fetchall( PDO::FETCH_ASSOC );


foreach ( $datas as $id => $value ) {

if(DBのデータをもとに、条件が一致しているかどうかを判断){
echo "matched";

              一致したら、もろもろの処理

}

}// end foreach


if( $dbObj ){
$dbObj->commit();
}

} catch (PDOException $e){ //end of try
//エラー処理
var_dump($e->getMessage());
}

$pdo = null;
sleep( 10 );
}// end of 子プロセス

}// end of while

?>

------------------------
このようなプログラムを書き、DBのデータと比較するため、
10秒毎に無限ループさせるプログラムを書いてます。

ただ、これだとひたすら子プロセスが生成されてしまい、
メモリを使い切ってしまい、開放できず、なにか良い方法がないかと思案しております。

# ps aux |grep php
root 13962 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13964 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13969 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13973 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13975 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13980 0.0 0.6 163344 6628 pts/1 S 16:07 0:00
/usr/bin/php /root/test/loop.php
root 13982 0.0 0.6 163344 6628 pts/1 S 16:08 0:00
/usr/bin/php /root/test/loop.php
root 13983 0.0 0.6 163344 6348 pts/1 S 16:08 0:00
/usr/bin/php /root/test/loop.php

このようにひたすらプロセス増え続けているのですが、条件マッチによる処理をしたいため、
既に過去のプロセスは必要なく、うまく処理してループを続ければと思うのですが、
よい方法はありますでしょうか。phpをこのように使うこと自体違っているのかもしれませんが、
何かありましたらご教授頂けると嬉しく思います。

よろしくお願い致します。


増田
--
mailto:masuken@xxxxx
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年6月25日 16:15
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/96668
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。