AJAX - 执行的shell命令的进度条

时间:2009-02-04 23:01:36

标签: php ajax linux shell progress-bar

我在我的网站上使用AJAX,我想向用户显示我的服务器正在下载的文件的进度。

下载是通过向shell输出百分比的脚本完成的。我想使用AJAX将此信息传递给用户。我怎么能这样做?

感谢您的帮助和指导。

我希望您的解决方案不涉及写入文本文件并从文本文件中检索该百分比!我觉得太过头了。

编辑 - 更多信息

这是一个Linux Shell命令 - Fedora Core 10。

目前这是shell输出的样子:

[download]   9.9% of 10.09M at 10.62M/s ETA 00:00

百分比发生变化,我希望将其捕获并在发生变化时将其发回给用户。

为了执行此操作,我使用PHPs exec()函数。

3 个答案:

答案 0 :(得分:3)

您可以使用popen而非exec。这将为您提供一个与fread一起使用的句柄,以便在命令生成时获取输出。

您需要解析它对百分比指标所做的更新。获得该数据后,您可以通过几种方式将其传输到客户端,例如:使用“comet”样式推送,或者对更新进行Ajax请求轮询。

答案 1 :(得分:0)

我没有试过这个,但我认为这种方法可行。

你需要三件:

  1. 让shell脚本将其流输出到连接到端口的netcat
  2. 让一个php脚本监听来自所述端口的流以获取传入数据,更新memcache或某个数据库中的记录并完成百分比。
  3. 让您的网络脚本定期向服务器发出ajax调用,以便在后端存储中检查此值。

答案 2 :(得分:0)

我正在研究类似的问题。我必须解析我的视频转换shell脚本的输出。我使用popen并解析返回的resource的输出。起初我使用fgets但是没有将更新的值识别为新行。所以我创建了一个简单的函数,它带有一个可选的$arg_delimiter,因此您可以检查其他返回类型,例如chr(13) cariage返回。示例代码有点修改,因此未经测试,因为在我的情况下,这些函数是我的解析器对象上的方法。

function get_line ($arg_handle, $arg_delimiter = NULL)
{
  $delimiter = (NULL !== $arg_delimiter) ? $arg_delimiter : chr(10);
  $result    = array();

  while ( ! feof($arg_handle))
  {
    $currentCharacter = fgetc($arg_handle);

    if ($delimiter === $currentCharacter)
    {
      return implode('', $result);
    }

    $result[] = $currentCharacter;
  }

  return implode('', $result);
}

我只是简单地循环来自popen() resource的结果:

  $command = '/usr/bin/yourcommand';
  $handle  = popen($command . ' 2>&1', 'r');

  while ( ! feof($handle))
  {
    $line = get_line($handle, chr(13));

    preg_match($yourParserRegex, $line, $data);

    if (count($data) > 0)
    {
      printf("<script type='text/javascript'>\n  //<![CDATA[\n    window.alert('Result: %s');\n  // ]]>\n</script>"
            ,$data[1]
            );
      flush();
    }

  }

现在你需要做的就是找出彗星的东西。