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

shige02 @ mac.com shige02 @ mac.com
2010年 6月 25日 (金) 17:27:52 JST


重松です。

うちの cli は fork できるようになっていないので試せないんですけど、

https://www.codeblog.org/blog/moriyoshi/20070208.html

とか参考になりませんか?

斜め読みしただけですけど、普通は子プロセスに上限を設けて、無限に子供が増えない対策をしたり、上記に書かれているように graceful restart に対応したり、そういうことが求められると思うんですが、現状全く考慮されていないように見えます。
# が、現段階ではそれ以前の問題だと思いますが。

On Jun 25, 2010, at 4:15 PM, 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をこのように使うこと自体違っているのかもしれませんが、
> 何かありましたらご教授頂けると嬉しく思います。
> 
> よろしくお願い致します。
> 
> 
> 増田
> -- 
> mailto:masuken @ gmail.com
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3

-- 
Osamu Shigematsu



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