PHP将命令行上打印的内容传递给变量

时间:2012-10-30 17:54:48

标签: php window

我有以下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);

2 个答案:

答案 0 :(得分:2)

就像你提到的那样,你的代码直接从命令行运行而不是从PHP CLI运行,很可能是因为日志文件权限,这意味着你必须先创建一个具有正确权限的日志文件,然后再写你的输出在那里!

例如,从命令行(不是PHP)确保删除日志文件buffer.txt并再次运行PHP代码。最有可能它不起作用,因为您的文件不存在。请记住,当您直接从命令行运行该命令时,您的日志文件buffer.txt将使用特殊权限创建(不仅是读/写,还包括组和所有者(Linux))。当PHP创建文件时,默认情况下,它为所有者/组使用nobody nobody,并且您已经有一个日志文件(当您从命令行运行相同的命令时),这是由其他用户创建的(我想是管理员),因此您可以确定PHP无法使用它,只是因为文件权限错误。通过在Linux中执行ls -ls或在Windows中执行DIR /Q来尝试查看当前日志文件所有者/组上的内容,以获取相关信息。

除了所有内容之外,请确保您没有在安全模式下运行PHP,因此exec可能无法按预期运行,因为如果PHP is in safe mode它已被禁用。

  1. shell_exec()(功能相当于反叛) 当PHP以安全模式运行时,此功能被禁用。

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

  3. 您可以使用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也是如此。

    请阅读有关Windows的Using command redirection operators或Linux的All about redirection文章中的命令重定向的详情。

    您的日志转换功能可能是这样的:

    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);
    }
    

    确保您创建的日志文件是可写的并具有正确的权限非常重要!

    我个人删除了日志文件,以确保我有最新且合理的日志文件。

    我打赌它会像这样或者小调整一样工作!

    如果它对您不起作用,请告诉我,我会详细说明!

答案 1 :(得分:0)

exec需要一个输出变量数组。 所以试试:

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

这将为您提供一个数组,其中每个元素都是您的命令返回的行。