【问题标题】:How can I run an external process without waiting for it to finish from a Perl CGI script?如何在不等待 Perl CGI 脚本完成的情况下运行外部进程?
【发布时间】:2012-12-18 18:26:31
【问题描述】:

是否可以在不等待子进程完成的情况下继续显示 CGI 脚本的 HTML,但在 CGI 脚本完成时子进程应该保持活动状态。

这就是我所拥有的,

-- 显示 HTML 页面

# html 页面设置...所以标题/其他内容

#the -c, -h are params are just params
system("perl subprocess.pm -c params -h 1 &");

#实际打印html页面设置
...

出于某种奇怪的原因,它在输出 html 页面之前等待子进程完成,即使我包含了 linux 的异步系​​统调用。它不会立即呈现页面。是否可以在不等待子进程完成的情况下打印html页面?

【问题讨论】:

标签: perl cgi subprocess


【解决方案1】:
  1. 这是可能的 - 请确保 autofulush 已打开 ($|=1;) as discussed here,或者在“Perl Cookbook”中(第 7.12 章。刷新输出)。

    您还需要通过“守护”子进程来解耦子进程 - 以see Ether's answer to a different question 为例

  2. 但是,这并不可靠,并且由于 HTTP 超时很容易损坏。因此,在网页上显示不断变化的输出的正确解决方案是:

    一个。更简单的解决方案:

    • 您的 CGI 脚本打印到一个临时 HTML 文件

    • 有时它会获取该临时文件,关闭 HTML 并将当前最新版本复制到从 htdocs 树可见的某个临时位置(例如,客户端可以通过 URL 引用该位置 - 比如说 http://your_server/tmp/AYZ122.html

    • 在创建临时文件的原始版本并产生子进程后,您的原始 CGI 会生成重定向到 http://your_server/tmp/AYZ122.html 的 HTTP 响应。

    • 1234563 /p>
  3. b.更难的解决方案:

  • 有点类似,主要 CGI 脚本会创建一个发送给用户的“请稍候”HTML 页面,并启动一个写入临时文件的子进程。

  • 但是子进程创建的临时文件不一定是整个HTML页面,而是一些数据文件。

  • 由原始 CGI 脚本创建的主 HTML 页面包含一个循环,该循环发出 AJAX 调用以检索最新数据(检索进程将读取由子进程写入的临时文件)并根据最新数据更新 HTML 页面.

【讨论】:

    【解决方案2】:

    还有另一种解决方案:使用 SSI(服务器端包含)。 您的 CGI 程序:

    • 1) 创建一个临时网页“请稍候” 包含指令#include virtual log-file;
    • 2) 初始化日志文件 f.e.在那里写第一条消息;
    • 3) 静默启动主子进程;
    • 4) 静默启动检查器子进程;
    • 5) 生成具有元标记REFRESH 的网页 重定向到临时网页。临时网页有 元标记 REFRESH 无重定向。

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

    效果是日志文件不断地显示给用户 在主子进程完成前每 N 秒更新一次。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2020-07-11
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多