[英]How can I run an external process without waiting for it to finish from a Perl CGI script?
是否可以在不等待子进程完成的情况下继续显示CGI脚本的HTML,但是当CGI脚本完成时,子进程应保持活动状态。
这就是我所拥有的
-显示HTML页面
#html页面设置...所以标题/其他内容
#the -c,-h是params只是params
system("perl subprocess.pm -c params -h 1 &");
#actually打印html页面设置
...
由于某些奇怪的原因,即使我包含了针对Linux的异步系统调用,它也会在输出html页面之前等待子进程完成。 它不会立即呈现页面。 是否可以在不等待子进程完成的情况下打印html页面?
有可能-请确保如此处讨论的那样或在“ Perl Cookbook”(第7.12章刷新输出)中确保autofulush处于( $|=1;
)上。
您还需要通过“守护”子进程来解耦子进程- 有关示例, 请参见Ether对另一个问题的回答
但是,这不可靠,并且由于HTTP超时而容易损坏。 因此,要在网页上显示不断变化的输出的正确解决方案是:
一种。 更简单的解决方案:
您的CGI脚本会打印到一个临时HTML文件
偶尔获取该临时文件,关闭HTML并将当前最新版本复制到htdocs树中可见的某个临时位置(例如,客户端可以通过URL引用该地址-例如http://your_server/tmp/AYZ122.html
创建临时文件的原始版本并生成子进程后,原始CGI会生成HTTP响应,重定向到http://your_server/tmp/AYZ122.html
。
该位置的临时HTML文件具有一个META REFRESH(META刷新),它指示它每N秒刷新一次(例如10),并为用户提供适当的消息/ CSS,以警告加载正在进行中,请等待。
b。 更难的解决方案:
有点类似,主要的CGI脚本创建了发送给用户的“请稍候” HTML页面,并启动了一个子进程,该子进程写入了一个临时文件。
但是,由子进程创建的临时文件不一定是整个HTML页面,而是某些数据文件。
由原始CGI脚本创建的主HTML页面包含一个循环,该循环发出AJAX调用以检索最新数据(检索过程将读取由子进程写入的临时文件),并根据最新数据更新HTML页面。
还有另一种解决方案:使用SSI(服务器端包含)。 您的CGI程序:
REFRESH
的网页,该网页具有重定向到该临时网页的信息。 临时网页具有不带重定向的元标记REFRESH。 检查器子流程每N秒检查一次主子流程的状态。 当主进程正常或异常完成时,检查程序进程将创建没有REFRESH元标记的最终网页,该网页的名称与临时网页的名称相同。
这样做的结果是,日志文件会显示给用户,并在主子进程完成之前每N秒连续更新一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.