客户端浏览器关闭时,服务器端perl CGI脚本中断

时间:2010-08-09 13:59:04

标签: perl cgi client apache

我一直在尝试解决一个小问题,但似乎我无法解决这个问题。

我写了一个HTML页面,在提交表单时调用了一个perl CGI脚本。这个CGI在服务器端执行一定数量的任务,我让脚本将这些任务的步骤打印到HTML页面上的iframe中。问题是,如果客户关闭浏览器或只是离开页面, CGI脚本在服务器端中断

HTML code:

<form action="/path/to/script.cgi" method="post" enctype="multipart/form-data" target="processing">
 <p>File to analyse: <input type="file" name="filename" size="50"/></p>
 <p><input type="submit" name="Submit" value="Analyse" /></p>
</form></font></p>

<p style="margin-left: 20"><font face="Arial" size="2" color="#000000">Analysing the file may take a while</font></p>
<iframe name="processing" width="70%" height="300">

</iframe>

CGI脚本:

my $query = new CGI;
print $query->header(-type => 'text/plain');
function1();
function2_takesLongTime($parameter);
function3();

因此,假设“function1”正在为文件分析(创建文件夹等)准备一些东西。 “function2”是一个很大的功能(可能持续15分钟)。它是一个perl程序,它有很多“打印”,由于CGI的“text / plain”标题,它被重定向到html页面的iframe(在程序中不使用缓冲$ |)。 httpd配置为超时超过15分钟,因此它不会来自那里。 “function3”正在清理。

如果客户端停留在html页面上,则CGI脚本运行完美。 如果客户端被停止(例如用户关闭窗口),则在服务器端执行功能1和2,但之后脚本似乎被中断,因为没有进行清理。

我尝试使用系统命令启动“function2”作为独立程序,或者创建一个perl库并调用该库的main函数,它仍然以相同的方式结束。 我认为无论客户端是否保留在页面上,服务器端脚本仍然会一直运行。是不是因为CGI脚本的“text / plain”标题无法返回给客户端脚本被中断?

如果有人能帮我解决这个问题,我将非常感激。

2 个答案:

答案 0 :(得分:3)

您需要以不同方式构建软件。使用某种异步编程,作业队列可以正常工作,并且仅使用CGI程序将作业放入队列中。使用您已经提到的库进行转换。

您似乎并不熟悉这个概念,因此我建议使用一个非常简单的概念:Qudo。如果您发现限制性太强,请切换到Gearman,我认为这是Perl世界中最受欢迎的版本(请参阅接口Gearman::XSGearman)。

TIMTOWTDI:如果您完全放弃CGI.pm提供的执行环境,请参阅例如: Catalyst's RunAfterRequest

答案 1 :(得分:2)

Watching long processes through CGI提供了解决此问题的简单方法。