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 -ls在 Linux 或DIR /QWindows 中执行来获得这个想法。

除此之外,请确保您没有在安全模式下运行 PHP,结果exec可能无法按预期运行,因为如果PHP 处于安全模式,它会被禁用。

  1. shell_exec()(相当于反引号的功能)当 PHP 在安全模式下运行时,此功能被禁用。

  2. exec() 您只能在safe_mode_exec_dir中执行可执行文件。出于实际原因,目前不允许在可执行文件的路径中包含组件。escapeshellcmd()在此函数的参数上执行。

您可以使用该phpinfo()功能检查服务器的 PHP 设置。

您的代码应该如下所示:

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也是如此。

请阅读有关命令重定向的更多信息,请参阅文章Using command redirection operator for Windows 或All about redirection for 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 回答