【问题标题】:Dump php system command output to a file将php系统命令输出转储到文件
【发布时间】:2010-10-20 15:02:25
【问题描述】:

在php系统命令中我们使用如下

system("ffmpeg -i test.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output_file.flv 2>&1 &"). 

请解释上述系统命令的用法。 '2>&1 &' 代表什么?我想将流程详细信息转储到文件中,我该怎么做?

非常感谢。

【问题讨论】:

    标签: php system command background-process


    【解决方案1】:

    2>&1«stderr» 重定向到«stdout»,最后& 使命令在background 中运行。

    为了完成它应该是

    «command» 2>&1 > /tmp/somefile.log &
    

    如果不将«stdout»重定向到从system()在后台运行的文件(或/dev/null)没有多大意义,因为您的命令会在PHP终止时立即被终止(例如达到时间限制)。

    来自system()手册:

    注意:如果程序以 这个函数,为了让它 继续在后台运行, 程序的输出必须是 重定向到文件或其他输出 溪流。不这样做会导致 PHP 挂起直到执行 程序结束。

    【讨论】:

      【解决方案2】:

      2>&1 将标准错误 (2) 日志重定向到标准输出 (1)。

      不确定末尾的额外 & 是做什么的。

      如果您想通过管道将 stderr 或 stdout 传输到文件,您可以轻松地做到这一点。

      要将 stderr 通过管道传输到文件,请将 2>&1 更改为 2>filepath

      文件路径最好是绝对文件路径(例如:2>/home/user/output.mpg)

      【讨论】:

        【解决方案3】:

        每个 UNIX 程序都有两个输出流:stdout 和 stderr。出于重定向目的,> 符号将 stdout(文件描述符 1)重定向到文件。 “2>”将stderr(文件描述符2)重定向到一个文件,在这种情况下由“&1”表示,它告诉shell使用文件描述符1(即stdout)。在 php 上下文中,这意味着这两个流都将打印在您的脚本输出中,您现在怀疑是否已经弄清楚了。

        命令末尾的 & 告诉 shell 在后台运行作业。我不知道你为什么要在这种环境下这样做。

        【讨论】:

        • 放一个 & 使命令运行而不等待输出。这有助于运行并发 PHP 脚本。想象一下顺序调用 100 个 cUrl,而不是并行运行它们。
        【解决方案4】:

        如果您想通过 PHP 写入文件,您还可以使用[exec()][1][passthru()][2],它们具有从命令返回所有内容的选项。 system() 只会返回最后一行。

        【讨论】:

          猜你喜欢
          • 2019-02-16
          • 1970-01-01
          • 2015-02-07
          • 2012-06-21
          • 1970-01-01
          • 2019-11-25
          • 2011-08-20
          • 2011-03-15
          • 2011-12-09
          相关资源
          最近更新 更多