【问题标题】:AJAX - Progress bar for a shell command that is executedAJAX - 执行的 shell 命令的进度条
【发布时间】:2009-02-04 23:01:36
【问题描述】:

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

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

感谢您的帮助和指导。

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

编辑 - 更多信息

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

目前这是 shell 输出的样子:

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

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

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

【问题讨论】:

  • 哪个外壳? Windows、Mac 还是 Linux?
  • 我更新了问题 - 它的 Linux。

标签: php ajax linux shell progress-bar


【解决方案1】:

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

您需要解析出它对百分比指示器所做的更新。获得该数据后,您可以通过多种方式将其提供给客户,例如使用“comet”样式推送,或者使用 Ajax 请求轮询更新。

【讨论】:

  • 感谢保罗的好主意。我很难等待 shell 命令给我所有的输出。我只得到部分输出,因为该命令覆盖了最后一行并且我的条件:while(!feof($handle)) 不会捕获其余的更新。有什么建议么?谢谢
【解决方案2】:

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

你需要三件:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多