4

使おうとしているのですshell_exec()が、使い方がよくわかりません。このページを参照しました:コマンドが完了するのを待たずに shell_exec を使用する方法はありますか? .

2 つの PHP ファイルを作成しました。

shell_exec.php

<?php 
    shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');
?>

log.php

<?php
    $file = __DIR__ . '/log.txt';
    $current = time() . ": sample text\r\n";
    file_put_contents($file, $current,FILE_APPEND);
?>

次に、ブラウザから shell_exec.php のページにアクセスしました。log.php を実行してファイルを作成することを期待していました。しかし、何も起こりません。

php上記のコードにある関数で指定されたphpパスは、オペレーティングシステムによって異なると思われます。現在、Windows でテストしているため、動作しない可能性があります。しかし、私は100%確信が持てません。

もしそうなら、どうすればphpパスを見つけて自分の環境で指定できますか? また、phpスクリプトを使用して呼び出すスクリプトを配布する場合shell_exec()、phpパスを見つけるためにコードを書く必要があるということですか? その場合、何か良い方法はありますか?

4

4 に答える 4

4

もしそうなら、どうすればphpパスを見つけて自分の環境で指定できますか? また、shell_exec() を使用するスクリプトを配布すると...

残念ながらそうです。スクリプトを配布する環境には、コマンド ラインPHP が必要です (これは、Web サーバーで使用される PHP と必ずしも同じではなく、異なるバージョンである可能性があります)。

そして、それを「見つける」簡単な方法はありません。

そのため、(配布時に) PHP コマンドライン実行可能ファイルが PATH にある必要があることを明確に示す必要があります。

その時点で、 shell_exec('php -q -f yourfile...') が機能するはずです。

You can redirect the output to a file (always the same if you want) and delete it if there are no errors. Otherwise the file will show what errors occurred, which may be useful.

UPDATE: and the first times, to debug, don't redirect the output, but try:

<?php
    Header("Content-Type: text/plain");
    error_reporting(E_ALL);
    print shell_exec('php "' . __DIR__ . '/log.php" 2>&1'); // > /dev/null 2>/dev/null &');
?>

This way you can see if the command hits some other snag, such as not having the rights to create the log.txt file in the first place.

于 2012-09-12T21:55:26.090 に答える
1

ファイルがスペースを含むディレクトリ ツリーにある場合は、次のような問題があります。

shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');

になります:

shell_exec('php somepath/with spaces in it/log.php > /dev/null 2>/dev/null &');

これにより、php がsomepath/with引数付きのスクリプトとして実行されます。

'spaces', 'in', 'it/log.php'

引数を引用符で囲んでみてください:

shell_exec('php "' . __DIR__ . '/log.php" > /dev/null 2>/dev/null &');
于 2012-09-12T21:59:29.650 に答える
0

shell_exec が実行すると予想されるコマンドラインを試しましたか?

その行の「-f」を見逃したと思います

于 2012-09-12T21:53:14.443 に答える
-2

これは本当に悪い考えのように見えます。なぜshell_execを使用してphpを呼び出すのですか?ブラウザからテストしていて、別のPHPファイルを介して呼び出しているように聞こえるので、サーバー環境にPHPインタープリターが機能していることがわかります。

shell_exec()の代わりに、ファイルをインクルードして直接使用する必要があります。

その場合、PHPバイナリのパスについて心配する必要はなく、実際にファイルをより細かく制御できるようになります。

于 2012-09-12T21:59:14.750 に答える