16

PHP exec呼び出しを使用して、数秒かかるスクリプト(サードパーティのWebサービス)を呼び出そうとしています。多くの苦労をした後、私はこれを古典的なhelloworldの例に減らしました。呼び出し元のスクリプトは次のようになります。

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

これを実行すると、出力には、予想どおりexecoutput.txtではなく、呼び出し元のスクリプトページのコピーが含まれていますhello world

このPHPスクリプトをexecを使用して実行できないのはなぜですか?コマンドをのようなものに変更するとls -l、期待どおりに出力がディレクトリリストになることに注意してください。ところで、それが重要な場合は、呼び出されたスクリプトを755にchmodしました...

更新-exec呼び出しを呼び出し元のスクリプトの最後に移動しましたが、少なくとも今は呼び出し元のスクリプトが出力に実行されていません。ポスターへのThxと私はこれらのアイデアのいくつかを試してみます。

ヘルプ!

ありがとうスティーブ

4

6 に答える 6

28

私もこの問題を抱えていましたが、これはphp(#11430)のバグであることがわかりました。修正は、phpスクリプト内で別のphpスクリプトを呼び出すときにphp-cliを使用することです。したがって、引き続きexecを使用できますが、ブラウザで呼び出すときにphpを使用するのではなくphp-cliを使用します。

exec("php-cli  somescript.php");

これは私のために働いた。

于 2010-05-19T17:49:18.283 に答える
16

execが実行しているのは、右端のコマンドを取得して、それを宛先に追加することです。phpスクリプトにシバン行がある場合は、phpインタープリターのバイナリディレクティブを含める必要はありません。

スクリプトの出力だけが必要な場合は、次を試してください。

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

ただし、ファイルにエラーを含めたくない場合は、ファイルに出力する前にSTDERRをリダイレクトする必要があります。そのようです:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

上記は、「HelloWorld」のみをexecoutputに出力する必要があります。

編集:

興味深いことに、この動作を取得しています。コマンド「ls」が機能したと述べました。このためのエイリアスを作成して、次のようなファイルに転送してみてください。

alias pexec='php /home/quote2bi/tmp/helloworld.php'

それから

exec('pexec > /tmp/execoutput.txt 2>&1 &')

シェル自体ではなく、execが入力を処理する方法に問題があるようです。

-ジョン

于 2009-02-19T17:18:13.263 に答える
8

問題はPHP自体にあり、スクリプトではすべてを$argvとして扱います。出力をファイルouから/dev/nullにリダイレクトしません。

私はしばらく前に同じ問題に直面しました。私がしたことはrunscript.php、/ opt / php-binにを作成し、このスクリプト内で実行すべき内容を実行することです。このようなもの:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

そして、あなたはそれを使用してそれを呼び出します:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

これを機能させることができた唯一の方法です。

于 2009-02-19T20:59:11.880 に答える
0

この領域での PHP の前述の問題を回避するには、これをシェル スクリプト内に入れてみませんか? その後、PHP は、すべてのリダイレクトを内部で処理するシェル スクリプトを実行できます。

動的に変更する必要がある場合は、シェル スクリプトを記述して実行してみませんか (もちろん、後でクリーンアップします)。

于 2009-02-26T02:04:20.300 に答える
0

単純に php スクリプトを実行している場合、コード全体を実行する 1 つの可能な方法は、php ファイルを実行して結果を出力する include() を使用することです。出力をテキスト ファイルに送信することはできませんが、Hello World の php スクリプトが次のようになっている場合は、ブラウザー ウィンドウに表示されるはずです。

<?php echo "Hello World!"; ?>

次に、ブラウザでそれを吐き出します。したがって、2番目のコードは次のようになります

<?php include("helloWorld.php");  echo " PHP ROCKS";?>

次のようなページになります。

こんにちは世界!PHPロックス

于 2010-10-02T18:12:14.790 に答える