繁体   English   中英

如何在不等待Perl CGI脚本完成的情况下运行外部进程?

[英]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页面?

  1. 有可能-请确保如此处讨论的那样或在“ Perl Cookbook”(第7.12章刷新输出)中确保autofulush处于( $|=1; )上。

    您还需要通过“守护”子进程来解耦子进程- 有关示例, 请参见Ether对另一个问题的回答

  2. 但是,这不可靠,并且由于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程序:

  • 1)创建一个包含指令#include虚拟日志文件的临时网页“请稍候”;
  • 2)初始化日志文件,fe在其中写入第一条消息;
  • 3)静默启动主子进程;
  • 4)静默启动检查程序子进程;
  • 5)生成一个带有META标签REFRESH的网页,该网页具有重定向到该临时网页的信息。 临时网页具有不带重定向的元标记REFRESH。

检查器子流程每N秒检查一次主子流程的状态。 当主进程正常或异常完成时,检查程序进程将创建没有REFRESH元标记的最终网页,该网页的名称与临时网页的名称相同。

这样做的结果是,日志文件会显示给用户,并在主子进程完成之前每N秒连续更新一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM