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