微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何不断地通知用户Perl CGI脚本的进度?

我把这个Perl脚本放在我的Apache服务器的cgi-bin文件夹中:

#!/usr/bin/perl use strict; use warnings; $| = 1; print "Content-type: text/htmlrnrn"; print "Hello there!<br />nJust testing .<br />n"; my $top = 5; foreach (1..$top) { print "i = $_<br />n"; sleep 1; }

我想在这里实现的是逐步更新网页,以显示用户更新的状态。 不过,我实际上得到的是整个输出,延迟5秒后。

有什么办法可以写出一个能够不断告知用户进度的脚本吗? 我有一个需要很长时间才能完成的脚本,我希望能够看到它的实时进度,而不是整个脚本的完成。

我也尝试将自动刷新模式设置为closures($ | = 0),但即使这样做也没有做任何事情。

并发使用持久的PHP套接

如何使用骆驼聚合将一条消息聚合成多个组?

PHP的Apache的权限 – 最佳实践

什么是代理? 在Apache中是什么? 它有很多不同的含义吗?

Xampp的APACHE不工作?

lockingnetworking应用程序只适用于Intranet

如何在我的电脑上运行PHP文件

如何在PHP 5,Fedora服务器上启用mbstring扩展

在单个目录中执行多个文件会导致Apache下的加载时间更长?

如何设置HTTPS进行本地testing?

Randal Schwartz展示了通过CGI观察长时间过程的更好方法

这就是说,说谎的内容类型将无济于事。 下面的脚本完全是你在Windows XP上使用Apache 2.2所要做的(因为最后一行输出需要十秒):

#!/usr/bin/perl use strict; use warnings; use CGI qw(:cgi); print header('text/plain'); $| = 1; print "Job startedn"; for ( 1 .. 10 ) { print "$_n"; sleep 1; }

现在,如果您要发送HTML,则无法避免大多数浏览器会等到他们认为足够的页面才能开始呈现的事实。

你想要实现的是可能的 – 浏览器通常呈现到目前为止所收到的内容,即使它不是完整的文档,只要有足够的标记就可以呈现任何东西。 我想知道为什么你使用rn为某些输出,而n为其他人 – 你应该是一致的,并始终使用n 。 另外,你要指定一个text / html的内容类型,但是在你的内容之前不要提供任何的html头文件( <html><title></title><body> )。

但是,“现代”的方法是立即返回页面输出,而稍后将要更新的部分保留为空的<div>元素。 然后你可以用javascript(通过AJAX请求)更新该元素的内容

假设你使用的是比1.3版本更新的Apache版本,这应该可以工作。 否则,您必须将您的脚本变成NPH(无解析头)CGI,这意味着它的文件名应以nph-为前缀,并输出完整的HTTP头,例如。

HTTP/1.1 200 OKn Content-type: text/htmlnn

看到(有点老) Apache常见问题的更多信息

要查看脚本是否正常工作,请尝试使用命令行工具来避免与浏览器混淆。 例如, curl会在收到数据后立即输出

如果你正在做的是一个重要的目的,我不会使用你目前的方法。 如果脚本需要很长时间才能运行,请将其分离到后台( 此处为info ),然后使用进度更新文件数据库。 然后,您可以使用自动刷新(JavaScript或Meta-REFRESH)iFrame来显示进度。 你也可以使用AJAX,但是这涉及更多一点。

当您将content-type设置为text / plain时,它是否符合您的期望? 也许浏览器中的HTML解析导致输出的延迟,因为你实际上并没有输出有效的HTML? (没有<html>或<body>标签

它通过禁用特定虚拟主机的Deflate模块为我工作。

SetEnv no-gzip 1

我想你也可以使用.htaccess文件来达到同样的效果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐