是否可以继续显示CGI脚本的HTML而无需等待子进程完成,但是当CGI脚本完成时,子进程应该保持活动状态。
这就是我所拥有的,
- 显示HTML页面
#html页面设置...所以标题/其他内容
#the -c,-h是params只是params
system("perl subprocess.pm -c params -h 1 &");
#actually打印html页面设置
...
出于一些奇怪的原因,它在输出html页面之前等待子进程完成,即使我包含了对linux的异步系统调用。它不会立即呈现页面。是否可以在不等待子流程完成的情况下打印html页面?
答案 0 :(得分:3)
这是可能的 - 请确保autofulush已开启($|=1;
)as discussed here,或“Perl Cookbook”(第7.12章.Flushing输出)中的问题。
您还需要通过“守护”来解耦子进程 - see Ether's answer to a different question以获取示例
但是,这不可靠并且由于HTTP超时而容易破损。因此,在网页上显示连续变化输出的正确解决方案是:
一个。更简单的解决方案:
您的CGI脚本将打印到临时HTML文件
偶尔接收该临时文件,关闭HTML并将当前最新版本复制到htdocs树中可见的某个临时位置(例如客户端可以通过URL引用 - 比如{{1 }}
您的原始CGI会在创建临时文件的原始版本并生成子进程后生成重定向到http://your_server/tmp/AYZ122.html
的HTTP响应。
该位置的临时HTML文件有一个META REFRESH,它指示它每隔N秒刷新一次(比如10),并为用户发出相应的消息/ CSS警告加载正在进行中,请稍候。< / p>
湾更难的解决方案:
有些类似,因为主CGI脚本会创建一个发送给用户的“请稍候”HTML页面,并启动一个写入临时文件的子进程。
子进程创建的临时文件不一定是整个HTML页面,而是一些数据文件。
由原始CGI脚本创建的主HTML页面包含一个循环,该循环发出检索最新数据的AJAX调用(检索过程将读取子进程写入的临时文件)并根据最新数据更新HTML页面
答案 1 :(得分:2)
还有另一种解决方案:使用SSI(服务器端包含)。 您的CGI计划:
REFRESH
的网页
重定向到临时网页。临时网页有
没有重定向的元标记REFRESH。检查器子流程 每N秒检查一次主子进程的状态。当。。。的时候 主要过程正常或异常完成检查 process创建最终的网页,而不使用REFRESH元标记 与临时网页同名。
效果是日志文件会持续显示给用户 在主子流程完成之前每N秒更新一次。
答案 2 :(得分:0)