あなたが述べたように、あなたのコードはPHP CLIからではなくコマンドラインから直接動作するのは、ログファイルのパーミッションが原因である可能性が最も高いです。つまり、最初に正しいパーミッションでログファイルを作成し、そこに出力を書き込む必要があります!
たとえば、(PHP ではなく)コマンド ラインから、ログ ファイルを削除しbuffer.txt
、PHP コードを再度実行してください。ファイルが存在しないため、おそらく機能しません。そのコマンドをコマンド ラインから直接実行すると、ログ ファイルbuffer.txt
が特別なアクセス許可(読み取り/書き込みだけでなく、グループと所有者 (Linux) も含む)で作成されることに注意してください。PHPがファイルを作成するとき、デフォルトでは所有者/グループに使用され、他のユーザー(管理者nobody nobody
だと思います)によって作成されたログファイルがすでにあります(コマンドラインから同じコマンドを実行したため)。ファイルのパーミッションが間違っているという理由だけで、PHP がそれを使用できないことは確実です。現在のログ ファイルの所有者/グループの内容を確認してくださいls -ls
Linux またはWindows で実行しDIR /Q
てアイデアを得ることができます。
すべてに加えて、PHP をセーフ モードで実行していないことを確認してください。PHP がセーフ モードexec
の場合は無効になるため、期待どおりに動作しない可能性があります。
shell_exec()
(バッククォートと同等の機能) この関数は、PHP がセーフ モードで実行されている場合は無効になります。
exec()
safe_mode_exec_dir
内でのみ実行可能ファイルを実行できます。実際的な理由から、現在、実行可能ファイルへのパスにコンポーネントを含めることは許可されていません。escapeshellcmd()
この関数の引数で実行されます。
関数を使用して、サーバーの PHP 設定を確認できますphpinfo()
。
コードは次のようになります。
exec("$cmd 2>&1", $output);
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', $cmd);
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', implode("\n", $output));
どういう意味ですか?あなたが言うなら2>&1
、あなたは現在リダイレクトされているstderr
場所にリダイレクトしています。コンソールに行くstdout
なら、それもそうです。ファイルに行く場合は、同様です。stdout
stderr
stdout
stderr
コマンド リダイレクトの詳細については、Windows のコマンド リダイレクト演算子の使用またはLinux のリダイレクトに関するすべての記事を参照してください。
ログ変換関数は、次のようになります。
function log_conversion($file_path, $text)
{
$file_dir = dirname($file_path);
if( !file_exists($file_dir) || !is_dir($file_dir) || !is_writable($file_dir) )
return false;
$write_mode = 'w';
if( file_exists($file_path) && is_file($file_path) && is_writable($file_path) )
$write_mode = 'a';
$handle = fopen($file_path, $write_mode);
if( !$handle )
return false;
if( fwrite($handle, $text. "\n") == FALSE )
return false;
@fclose($handle);
}
作成するログ ファイルが書き込み可能で、適切な権限を持っていることを確認することが非常に重要です。
ログファイルが存在する場合は個人的に削除し、最新の適切なログファイルがあることを確認します.
このように、または少し微調整するだけでうまくいくと思います!
うまくいかない場合は、お知らせください。詳しく説明します。