1

バックグラウンドで実行するphpスクリプトを作成したいと思います。pcntl_forkが必要です。私はこの関数を使用して子供をフォークします:

function launchchild($programexe,$programvars) 
{ 
//foreach ($tasks as $key => $v){ 
switch ($pid = pcntl_fork()) { 
  case -1: 
     // @fail 
     die('Fork failed'); 
     break; 

  case 0: 
     // @child: Include() misbehaving code here 
     pcntl_exec($programexe,$programvars);
     break; 

  default: 
     // @parent 
     //pcntl_waitpid($pid, $status); 
     break; 
} 

//print "Done! :^)\\n\\n"; 
}

私はそれを以下のようなスニペットですぐに呼び出します:

$parameters = array('/Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/gather_checks.php', $serialize_triagger, $server_list[$server_choose]);
launchchild('/Applications/XAMPP/xamppfiles/bin/php',$parameters); // fork a child for parallel processing.

そのため、数分間だけ正常に動作します。'ps-ax|でプロセスをチェックしました grepphp'。コードが35エラーを出すまで終わらないプロセスがたくさんあるのを見ました。これは、それを実行するためのメモリがこれ以上ないことを意味します。これは'ps-ax|の結果です。grep php '

ps -ax | grep php
12020 ttys001    0:00.07 /Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/main.php
12021 ttys001    0:00.00 (php-5.3.1)
12022 ttys001    0:00.00 (php-5.3.1)
12025 ttys001    0:00.00 (php-5.3.1)
12028 ttys001    0:00.00 (php-5.3.1)
12037 ttys001    0:00.00 (php-5.3.1)
12040 ttys001    0:00.00 (php-5.3.1)
12043 ttys001    0:00.00 (php-5.3.1)

// pcntl_waitpid($ pid、$ status);のコメントを外すと それは問題なく魅力のように機能します。しかし、私は親が子供の仕事を待たせたくありません。どんなことでも役に立ちます。

4

2 に答える 2

1

のようなPHPのPCNTL関数はpcntl_fork、子プロセスが適切にクリーンアップされないため、Webサーバーから使用しないでください。(お気づきのことと思いますが。)これらの関数は、主にスタンドアロンのPHPデーモンでの使用を目的としており、ここでは適用されない特別な場合に使用されます。

proc_open()代わりに、のような高レベルのプロセス制御機能を使用してください。プロセスをバックグラウンドで実行する必要がある場合は、。を使用してシェルを介してプロセスを実行します&

于 2013-01-20T02:17:23.183 に答える
0

別のプログラム/スクリプトを起動しているので、フォークは必要ありません。ターミナルを使用するだけですsystem()screenidk if&works)

于 2013-01-20T02:05:45.813 に答える