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