web-dev-qa-db-ja.com

PHPスクリプトを使用して実行できないPHP exec

PHP exec callを使用して、数秒かかるスクリプト(サードパーティのWebサービス)を起動しようとしています。かなり苦労した後、これを従来のhello worldの例に減らしました。呼び出しスクリプト次のようになります。

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

これを実行すると、出力execoutput.txtには、予期したhello worldではなく、呼び出しスクリプトページのコピーが含まれます。

なぜこれを取得できないのですかPHPスクリプトを実行してexecを使用して実行しますか?コマンドをls -lのようなものに変更すると、出力は期待どおりのディレクトリリストになります。btw、必要に応じて、呼び出されたスクリプトを755にchmodしました...

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

助けて!

おかげでスティーブ

15
Steve

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

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

これでうまくいきました。

28
Keith

Execが実行していることは、右端のコマンドを受け取り、それを宛先に追加することです。 phpスクリプトにShebang行がある場合、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')

上記は "Hello World"のみをexecoutputに出力します。

編集:

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

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

その後

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

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

-ジョン

16
John T

問題は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')

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

8
Luiz Damim

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

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

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

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

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

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

1
Nathan

PHPこの領域に記載されている問題を回避するには、これをシェルスクリプト内に配置しませんか?PHPすると、すべてのリダイレクトは内部で処理されます。

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

0
Jeremy L

これは、ブラウザからスクリプトを実行する場合と同じように実行されます。

これは、Linuxプラットフォームでのプロジェクトの作業中に発生しました。

exec('wget http://<url to the php script>)

お役に立てれば!!

0
Amar