将命令行输出的内容用PHP存入变量

3

I have the following PHP code:

<?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个回答

2

就像你所提到的,你的代码可以直接从命令行运行,但是不能从PHP CLI中运行。这很可能是由于日志文件权限不正确导致的,这意味着你必须先创建一个具有正确权限的日志文件,然后将输出写入其中!

例如,从命令行(不是PHP)确保你删除了日志文件buffer.txt并重新运行你的PHP代码。很可能不起作用,因为你的文件不存在。请记住,当你直接从命令行运行该命令时,你的日志文件buffer.txt是使用特殊权限(不仅是读/写,还包括组和所有者(Linux))创建的。当PHP创建一个文件时,默认情况下,它使用nobody nobody作为所有者/组,并且你已经有一个日志文件(因为你从命令行运行了同样的命令),它是由其他用户(我猜测是管理员)创建的,结果是,由于错误的文件权限,PHP将无法使用它。尝试通过在Linux中执行ls -ls或在Windows中执行DIR /Q来查看当前日志文件的所有者/组。

除此之外,请确保你没有在安全模式下运行PHP,因为如果PHP处于安全模式exec可能无法按预期工作。

  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也会如此。
请在文章使用命令重定向运算符(适用于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);
}

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

我个人会删除日志文件(如果存在),以确保我拥有最新和合理的日志文件。

我敢打赌,它将像这样工作,或者需要进行小的调整!

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


0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接