1

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

下载是由向 shell 输出百分比的脚本完成的。我想将此信息传递回使用 AJAX 的用户。我怎样才能做到这一点?

感谢您的任何帮助和指导。

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

编辑 - 更多信息

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

目前这是 shell 输出的样子:

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

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

为了执行这个,我使用了 PHP 的 exec() 函数。

4

3 回答 3

3

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

您需要解析它对百分比指示器所做的更新。一旦你有了这些数据,有几种方法可以把它送到客户端,例如使用“ comet ”风格的推送,或者让 Ajax 请求轮询更新。

于 2009-02-04T23:20:02.750 回答
0

我还没有尝试过,但我认为这种方法会奏效。

你需要三件:

  1. 让 shell 脚本将其流输出到连接到端口的 netcat
  2. 有一个 php 脚本侦听来自所述端口的传入数据的流,更新 memcache 或某些数据库中的记录并完成百分比。
  3. 让您的 Web 脚本定期向服务器发出 ajax 调用,该服务器在您的后端存储中检查此值。
于 2009-02-04T23:35:03.453 回答
0

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

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();
    }

  }

现在你需要做的就是弄清楚彗星的东西。

于 2009-06-17T00:57:34.770 回答