2016-08-09 14 views
0

私は不思議だった。 PHPリクエストがあり、PHPコードがexec経由でコマンドラインツールを呼び出した場合PHPとマルチスレッド

コマンドラインは、PHPスクリプトが実行されているスレッドとは別のスレッドで処理されていますか?

もし両方のコアで共有されているのであれば? manual suggestsとして

+2

が答えることはちょうど約ました... – obe

+0

@obeだけ)( –

答えて

1

プログラムは、それがバックグラウンドで実行を継続するためには、この機能を起動した場合は、プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまでPHPが停止します。

これは、プロセスがフォークされておらず、メインスレッド上で実行されていると考えられる場合があります。 PHPは実際に出力が終了するのを待って、ログの最後の行を取得します。

ただし、バックグラウンドでコマンドを実行する方法があります:

nohup MY_COMMAND > /dev/null 2>&1 & echo $! 

execは、出力の最後の行の値を受信するので、これはプロセスのpidを返し、あなたができるようになります後でkillになります。


また、N.B. fpm - FastCGI Process Managerを使用する場合は、 fastcgi_finish_request()関数を使用することができます。

この関数は、スクリプトの実行を停止せずにクライアントに応答を返します。

mail($recipient, 'Subject', 'Hello, Kitty!'); 
echo 'Okay, we sent the e-mail'; 

そして、これはあなたがfpmに電子メールを送信できるかである:例えば、これはあなたがfpmせずに電子メールを送信する方法である

echo 'Okay, we sent the e-mail'; 
fastcgi_finish_request(); 
mail($recipient, 'Subject', 'Hello, Kitty!'); 

この場合、クライアントはエコーれますテキストとmail関数は引き続きバックグラウンドで実行されます。

ちょうどあなたがfpmを使用する前session_write_close();であなたのセッションを閉じることを忘れないでください;)私はclarkkさんのコメントに気づいたときに

+0

もあります 'fastcgi_finish_requestコメントをフラグ'' php-fpm'ユーザが利用できます。これはサーバに応答を返し、その機能の後のすべてがバックグラウンドで実行され続けます(並べ替え)。あなたはあなたの答えでそれを言えるでしょうか?私はこの情報だけを含むもう一つの答えでスレッドを汚染したくありません。 –

+0

@ N.B。私はヒントのために、私の答え、高校を更新しました! –