【问题标题】:AJAX Progress: Reading output from the ShellAJAX 进度:从 Shell 读取输出
【发布时间】:2010-10-06 04:11:06
【问题描述】:

目标:制作一个进度条,用户可以在其中查看我的服务器下载了多少文件。

场景:我有一个 PHP 脚本,它通过 popen 执行 python 脚本。我是这样做的:

$handle = popen('python last', 'r');

$read = fread($handle, 4096);

pclose($handle);

这个 python 脚本输出到 shell 是这样的:

[last] ZVZX-W3vo9I: Downloading video webpage
[last] ZVZX-W3vo9I: Extracting video information
[download] Destination: myvideo.flv
[download]   9.9% of 10.09M at    3.30M/s ETA 00:02

问题:当我读入由shell输出生成的文件时,我得到了除了最后一行之外的所有shell输出!?为什么?

补充一点,当我通过 shell 运行命令时,shell 光标出现在该行的末尾并等待脚本完成。

谢谢大家

【问题讨论】:

  • 通读您的问题,我不禁注意到您遇到的 problem (输入中缺少行)与问题标题无关。您可能会更改标题以解决您的问题。也许“PHP:从 shell 读取输出”更好,因为这与 AJAX 无关。

标签: php linux shell command-line


【解决方案1】:

这将是你的朋友:

$handle = popen('python last 2>&1', 'r');

更多信息可以在这里找到:Wikipedia

【讨论】:

    【解决方案2】:

    你读到EOF了吗?

    $handle = popen('python last', 'r');
    $read   = "";
    
    while (!feof($handle)) {
      $read .= fread($handle, 4096);
    }
    
    pclose($handle);
    

    【讨论】:

      【解决方案3】:

      我首先想到的是:也许程序检测到它没有在 TTY 上执行,因此没有显示最后一行,这可能涉及丑陋的控制字符,因为该行似乎在更新自己?

      当您将输出重定向到文件(在 shell 中)或通过 less 管道时会发生什么?如果你没有看到最后一行,很可能就是这种情况。除了修复源,我不知道其他解决方案。

      【讨论】:

      • 是的,最后一行会自行更新。我如何获得正在更新的内容?
      • 好吧,正如我所说,当程序检测到它没有在 tty 上运行时,它可能根本没有打印出来。如果是这种情况,您将不得不修改程序或尝试找到一个命令行选项(如果可用)以便它打印信息,即使它不在 tty 上。
      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多