以下は、私が実行しようとしたコマンドですが、成功しませんでした:
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 function の出力結果を受け取ることができます。
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
$ outputパラメータは、呼び出し元のプログラムがSTDERRに出力を出力する場合は機能しないようです。
これを処理するより良い方法は、execからの出力をファイルにリダイレクトし、エラー条件が存在する場合はそのファイルの内容を表示することです。
$ cmdがexecコマンドを保持している場合は、次のように追加します。
$cmd.=" > $error_log 2>&1"
次に、$ error_logのファイル指定の内容を調べて、コマンドが失敗した理由の詳細を確認します。
また、コマンドの最後に&を付けてこれをオフにすると、$ error_logの内容をすぐにチェックしてもログ情報が表示されない場合があることに注意してください。OSが完了する前にスクリプトがファイルをチェック/処理する場合があります。
次のコードは、(StdOutからの)通常の出力と(SdtErrからの)エラー出力の両方をキャプチャします。
exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output);
var_dump($output);
これは私にとっていくつかのシナリオでうまくいきました:
ob_start();
exec($cmd . " 2>&1", $output);
$result = ob_get_contents();
ob_end_clean();
var_dump($output);
"2の間のスペースは重要です
その2番目のパラメーターでエラーが見つからない場合は、Apacheのエラーログを検索できます。たとえば、Ubuntu Server 12.10で、コマンド$ tail /var/log/Apache2/error.logを使用して、python phpからのスクリプト。そのエラーはそこにのみ出力されたため、診断することができました。宜しくお願いします。
これは質問への直接の回答ではありませんが、返されたエラーコードによって正確に何が起こったかを知りたい場合に非常に役立ちます。
エラーコード($ 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