PHP 获取命令行上打印的内容到变量

标签 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 .'"'

进入一个变量,例如$输出

到目前为止,这段代码打印出空白:

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

最佳答案

正如您提到的,您的代码直接从命令行运行,而不是从 PHP CLI 运行, 很可能是因为日志文件权限,这意味着您必须先创建一个具有正确权限的日志文件,然后将输出写入其中!

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

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

  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 operators适用于 Windows 或 All about redirection适用于 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);
}

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

如果日志文件存在,我会亲自删除它,以确保我有最新且合理的日志文件。

我打赌它会像这样工作或稍作调整!

如果它不适合你,请告诉我,我会详细说明!

关于PHP 获取命令行上打印的内容到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144911/

相关文章:

php - 将 CSV 字符串从 Javascript 传递到 PHP

php - 如何检查一个类中的函数是否存在于另一个类中?

php - 使用 PHP 将文本插入 MySQL 数据库时出现字符集问题

php - AS3中有效压缩转PHP

mysql - 扩展行集的平均计算

c++ - 如何使用visual studio和MFC C++在windows上实现预览

php - FFMPEG 与 PHP 将视频转换为 mp4 和快照

javascript - 弹出窗口拦截器 API - 如何检查用户是否启用了它

c - 检测进程是否空闲

Python:如何使用 Xlib 在工作区之间切换?