[PHP-users 35255] php cli版での常駐プログラムとメモリ開放について
Masuda
masuken @ gmail.com
2010年 6月 25日 (金) 16:15:46 JST
増田と申します。
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 @ gmail.com
PHP-users メーリングリストの案内