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

木内智史之介 scholar @ hayabusa-lab.jp
2010年 6月 25日 (金) 16:23:46 JST


増田さん

こんにちわ。木内です。

ぱっと見の回答になってしまいますが、
無限ループ内の頭にてforkしているのが原因ではないでしょうか?

--------------------
木内智史之介 <scholar @ hayabusa-lab.jp>

(2010/06/25 16:15), Masuda wrote:
> 増田と申します。
> 
> 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をこのように使うこと自体違っているのかもしれませんが、
> 何かありましたらご教授頂けると嬉しく思います。
> 
> よろしくお願い致します。
> 
> 
> 増田


PHP-users メーリングリストの案内