2010-12-07 16 views
9

私は、コマンドラインで実行されるPHPスクリプトを作成しています。このスクリプトの一環として、完了するまでに長い時間がかかる可能性がある別のスクリプトを作成/フォークする必要がある場合があります。私は元のスクリプトが完了するのをブロックしたくありません。 JavaScriptでこれをやっていたら、バックグラウンドでAJAXリクエストを実行できます。それは本質的に私がここでやろうとしていることです。私はフォークがいつ完了するかを知る必要はなく、ただ彼ら自身がスタートして完了するだけです。PHPスクリプトを非同期で実行するには?

これらのPHPスクリプトを非同期で実行するにはどうすればよいですか?

foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     //start some asynchronous process here, and pass it $item 
    } 
} 
+0

あなたは、「私は時にフォークを完全に知っている必要はありません」と、あなたのコードは言う「それに$アイテムを渡す」と言います。あなたは出力を取得したいのですか? – Jonas

+0

PHPはスレッドをスープしません。子プロセスをフォークするか、より良い方法はcronを作ることです。 – RobertPitt

+0

NeqO - いいえ、フォークは何も返す必要はありません。 – Andrew

答えて

2

int pcntl_fork (void)

pcntl_fork()関数は、そのPIDおよびPPIDで親プロセスとは異なる子プロセスを生成します。システムでforkがどのように動作するかについては、システムのfork(2)のマニュアルページを参照してください。

詳細:http://php.net/manual/en/function.pcntl-fork.php

関連する質問:PHP: What does pcntl_fork() really do?

プロセス制御はWebサーバ環境で有効にするべきではなく、任意のプロセス制御機能は、Webサーバ内で使用されている場合、予期しない結果が起こるかもしれません環境。

詳細:http://www.php.net/manual/en/intro.pcntl.php

2

ユーザーを探しにはチェックアウト、あなたがそれを使用することができますように見える、幹部にメモを寄付:

http://de3.php.net/manual/en/function.exec.php#86329

<?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
?> 

これは$を実行しますcmdなしで バックグラウンド(cmdウィンドウなし) tを待っていますo完了: WindowsとUnixの両方で。

+0

http://www.php.net/manual/en/function.popen.php#92413 – gawpertron

3
$pids = array(); 
foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     $pid = pcntl_fork(); 
     if ($pid == 0) { 
      // you're in the child 
      var_dump($item); 
      exit(0); // don't forget this one!! 
     } else if ($pid == -1) { 
      // failed to fork process 
     } else { 
      // you're in the parent 
      $pids[] = $pid; 
     } 
    } 

    usleep(100); // prevent CPU from peaking 
    foreach ($pids as $pid) { 
     pcntl_waitpid($pid, $exitcode, WNOHANG); // prevents zombie processes 
    } 
} 
関連する問題