質問
以下は、成功せずに実行しようとしたコマンドです:
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');
die()を最後に追加すると、エラーがあることがわかります:
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');
上記のexec()ステートメントでは、パーミッションの問題がエラーの原因となっていますが、PHPはそれを表示していません。発生しているエラーをPHPからどのように表示しますか?
解決
オプションの2番目のパラメーターを渡すことにより、 exec関数の出力結果を受け取ることができます:
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
他のヒント
呼び出し元プログラムがSTDERRに出力を吐き出す場合、$ outputパラメーターは機能していないようです。
これを処理するより良い方法は、execからファイルに出力をリダイレクトし、エラー状態が発生した場合にそのファイルの内容を表示することです。
$ cmdがexecコマンドを保持している場合、次のようなものを追加します。
$cmd.=" > $error_log 2>&1"
次に、コマンドが失敗した理由の詳細について、$ error_logのfilespecの内容を調べます。
また、これを<!> ampで分岐した場合も注意してください。コマンドの最後で、$ error_logの内容をすぐに確認してもログ情報が表示されない場合があります。スクリプトはOSが終了する前にファイルを確認/処理する場合があります。
次のコードは、標準出力(StdOutから)とエラー出力(SdtErrから)の両方をキャプチャします。
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output);
var_dump($output);
これは私のために働いた: コマンドの最後に2 <!> gt; <!> amp; 1を追加します。
こちらをご覧ください: php exec()がエラーメッセージを返さないsvnコマンド実行時の出力
乾杯
これはいくつかのシナリオでうまくいきました:
ob_start();
exec($cmd . " 2>&1", $output);
$result = ob_get_contents();
ob_end_clean();
var_dump($output);
<!> quotの間のスペース。 2 は重要です
2番目のパラメーターでエラーが見つからない場合、たとえばUbuntu Server 12.10でコマンドを使用して、Apacheのエラーログを検索できます。 $ tail /var/log/apache2/error.log 私はphpからpythonスクリプトを実行していましたが、そのエラーはそこにのみ出力されていたため、診断することができました。 よろしく。
これはあなたの質問に対する直接的な答えではありませんが、返されたエラーコードによって何が起こったのかを正確に知りたい場合には非常に便利です。
エラーコード($ res)の場合、コマンドによって返されます:
exec('command', $out, $res);
は、PHP(コマンドを実行するために)から呼び出されたシェル(BASHなど)によって返された範囲よりも1〜2、126〜165、255の範囲でした。返されたコードがこの範囲にない場合、コマンド(シェルではなく)によって返されたコードよりも多くなります。
参照(BASHエラーコードの説明について)
https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html