3

次のPHPコードがあります。

<?php
$video = "C:\Users\Administrator\myVideo\processing\video.mp4";
$cmd = 'ffmpeg -i "' . $video .'" 2>&1 | wtee buffer.txt'; // wtee is a Windows version of tee

exec($cmd);
echo($cmd);
?>

上記のコードを含むを実行するaa.phpと、機能しません。

しかし$cmd、コマンドプロンプトでエコーアウトされているを直接実行すると、ファイルbuffer.txtが作成されて機能します。

これの出力を取得したい:

$cmd = 'ffmpeg -i "' . $video .'"'

のような変数に$output

このコードは、これまでのところ空白で出力されます。

exec($cmd,$output,$result);
print_r($output);
4

2 に答える 2

2

あなたが述べたように、あなたのコードはPHP CLIからではなくコマンドラインから直接動作するのは、ログファイルのパーミッションが原因である可能性が最も高いです。つまり、最初に正しいパーミッションでログファイルを作成し、そこに出力を書き込む必要があります!

たとえば、(PHP ではなく)コマンド ラインから、ログ ファイルを削除しbuffer.txt、PHP コードを再度実行してください。ファイルが存在しないため、おそらく機能しません。そのコマンドをコマンド ラインから直接実行すると、ログ ファイルbuffer.txtが特別なアクセス許可(読み取り/書き込みだけでなく、グループと所有者 (Linux) も含む)で作成されることに注意してください。PHPがファイルを作成するとき、デフォルトでは所有者/グループに使用され、他のユーザー(管理者nobody nobodyだと思います)によって作成されたログファイルがすでにあります(コマンドラインから同じコマンドを実行したため)。ファイルのパーミッションが間違っているという理由だけで、PHP がそれを使用できないことは確実です。現在のログ ファイルの所有者/グループの内容を確認してくださいls -lsLinux またはWindows で実行しDIR /Qてアイデアを得ることができます。

すべてに加えて、PHP をセーフ モードで実行していないことを確認してください。PHP がセーフ モードexecの場合は無効になるため、期待どおりに動作しない可能性があります

  1. shell_exec()(バッククォートと同等の機能) この関数は、PHP がセーフ モードで実行されている場合は無効になります。

  2. 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なら、それもそうです。ファイルに行く場合は、同様です。stdoutstderrstdoutstderr

コマンド リダイレクトの詳細については、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);
}

作成するログ ファイルが書き込み可能で、適切な権限を持っていることを確認することが非常に重要です。

ログファイルが存在する場合は個人的に削除し、最新の適切なログファイルがあることを確認します.

このように、または少し微調整するだけでうまくいくと思います!

うまくいかない場合は、お知らせください。詳しく説明します。

于 2012-10-30T18:15:56.253 に答える
0

exec出力変数の配列が必要です。だから試してください:

$output = array();
exec($cmd, $output, $result);

これにより、各要素がコマンドによって返される行である配列が得られます。

于 2012-10-30T18:14:28.817 に答える