我在我的网站上使用AJAX,我想向用户显示我的服务器正在下载的文件的进度。
下载是通过向shell输出百分比的脚本完成的。我想使用AJAX将此信息传递给用户。我怎么能这样做?
感谢您的帮助和指导。
我希望您的解决方案不涉及写入文本文件并从文本文件中检索该百分比!我觉得太过头了。
这是一个Linux Shell命令 - Fedora Core 10。
目前这是shell输出的样子:
[download] 9.9% of 10.09M at 10.62M/s ETA 00:00
百分比发生变化,我希望将其捕获并在发生变化时将其发回给用户。
为了执行此操作,我使用PHPs exec()函数。
答案 0 :(得分:3)
您可以使用popen而非exec。这将为您提供一个与fread一起使用的句柄,以便在命令生成时获取输出。
您需要解析它对百分比指标所做的更新。获得该数据后,您可以通过几种方式将其传输到客户端,例如:使用“comet”样式推送,或者对更新进行Ajax请求轮询。
答案 1 :(得分:0)
我没有试过这个,但我认为这种方法可行。
你需要三件:
答案 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();
}
}
现在你需要做的就是找出彗星的东西。