2012-01-17 14 views
3

私はDebianのOS-Xシステムで開発されたPHPスクリプトをテストしています。バックグラウンドでのPHPスクリプトの実行

はそれを再現するために、私は2つのスクリプトを書いた:parent.phpとchild.php:

parent.php:

#!/usr/bin/php 
<?php 

echo "parent started...\n"; 
shell_exec(__DIR__ . '/child.php &2>/dev/null &'); 
echo "parent finished.\n"; 

child.php:

#!/usr/bin/php 
<?php 

echo "child started...\n"; 
sleep(5); 
echo "child finished.\n"; 

parent.phpを実行しますOS-Xでは、2つの出力行(親が開始、親が終了)を即座に取得します。 Debianで私は "parent started ..."という行を得てから、5秒遅れて "parent finished。" ./child.php & 2>/dev/null & "をシェルで実行すると、即座に即座にプロンプ​​トが返されます。どのように私はこれを修正することができる任意のアイデア?

+2

、私は通常、 'としてそのexecの行を書く{CMD}>を/ dev/null 2>&1&' - 興味があると思いますそれが違いを生むかどうかを知る。 – DaveRandom

+0

あなたは '&2/dev/null'でエラーを抑制することを意味しましたか、単に出力を抑止したいのですか? –

答えて

4

&2>部分です。すべてのシステムでサポートされているわけではありません。すべてのシェル(bash、sh、kshなど)にも。

あなたはすべての出力がこの、ちょうどテスト

exec("/bin/bash -c '/usr/bin/php /path/to/child.php &> /dev/null ' &"); 

BASH-HOWTO

を使用抑制したい場合は、exec("/usr/bin/php /path/to/child.php > /dev/null 2>&1 &")はあまりにも動作するはずです。

exec("/bin/bash -c '/usr/bin/php /path/to/child.php 2> /dev/null' &"); 

、これを試してみてください私はそれは私はあなたがそれが動作言っているので、前に見たことがないだけ速記だと確信していますが

+0

あなたの最後の行には、子プロセスを親プロセスから分離するために最後に '&'がありません。 – DaveRandom

+0

@daveありがとう。私があまりにも速く入力したので、それを逃した。 –

+0

ありがとうございます。よく働く! – stofl

2

shell_execの代わりにexec()またはsystem()を試してください。おそらく、shell_execは異なるOSで同じ動作をしません。

関連する問題