[PHP-users 25180] Re: cli をデーモンとして使用する際の注意

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2005年 3月 29日 (火) 14:23:02 JST


桝形です。

> komura です。
> 
> > 厳密に管理する術があるなら教えてホシィです。
> 
> この問題ですが、デーモンにするのであれば、pcntl_fork() を使用すること
> で回避できないでしょうか?

連絡が遅くなってしまいましたが試してみました。
個人的な感想ですが(使い方次第では)いけるのでは、と思いました。

(子プロセスに処理をまかせて、そちらのリソースを適時開放という事ですね)


forkのオーバーヘッドは仕方が無いと考えます。

以下のプログラムでは、もう少し考慮するトコロがありますが
その辺ご容赦。。。という事で。

daemon_test.php:
---------------------------------------------------------------------
#!/usr/local/php/5.0.3/bin/php -c /home/masugata/daemon/php.ini
<?
set_time_limit( 0 );

$Connect = mysql_connect( "*****", "*****", "*****" )
or die( "Could not connect[".mysql_error( $Connect )."]" );

mysql_select_db( "*****", $Connect )
or die( "Could not select database[".mysql_error( $Connect )."]" );

while( true )
{
 echo "---------------------------------------------\n";
 $pid = pcntl_fork( );

 if( $pid === -1 ){ exit; }

 // 親プロセス
 if( $pid )
   {
    pcntl_waitpid( -1, $status, WUNTRACED );
    // ↑この辺イジるとコネクション数が子プロセスの数分だけ
    // ↑増えたので並列展開は難しいのカモ
    // ↑リソース絡みは共有ではなくて丸々コピーしているような
    // ↑動作。それによってコネクション数が増えているように
    // ↑見えたのかも(想像)
    // ↑「mysqladmin status」コマンドのThreads数で確認。

    continue;
   }

 // 子プロセス
 $SQL    = "select * from test where no1 != '1'";
 $Result = mysql_query( $SQL, $Connect );

 if( $Result == false )
   {
    die( "warning!![".mysql_error( $Connect )."]\n" );
    exit;
   }

 $DB_Array = array( );

 while( $Record = mysql_fetch_array( $Result, MYSQL_ASSOC ) )
 {
  $DB_Array[] = $Record;
 }

 echo "[".date( "Y/m/d H:i:s" )."]SELECT => ".count( $DB_Array )."\n";
 exit;
}

?>
---------------------------------------------------------------------

-- 
Seiji Masugata<s.masugata @ digicom.dnp.co.jp>




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