2010-08-09 113 views
3

我一直在尝试解决一个小问题很长一段时间,但它似乎我无法。当客户端浏览器关闭时中断服务器端perl CGI脚本

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

HTML代码:

<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(); 

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

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

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

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

+0

看来问题来自我的“功能2”中的系统调用命令。我尝试调用其他不具备系统命令的函数,即使客户端没有响应,CGI脚本也会一直运行。我也尝试删除CGI头文件,并且脚本也完美运行。我想这是系统调用和CGI将标准输出实时刷新到客户端的事实,从而导致错误发生...... – 2010-08-09 17:04:32

回答

3

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

你似乎并不熟悉这个概念,所以我推荐一个非常简单的:Qudo。如果你觉得它太严格了,可以切换到Gearman,我认为它是Perl世界中最流行的一个(请参阅接口Gearman::XSGearman)。

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

+0

感谢您的回复Daxim, “TIMTOWTDI”:这是正确的,但是我的应用程序是线性的。即使认为我运行的程序非常大,我并不需要多任务。此外,我真的很想了解我的CGI脚本发生了什么。我一直在用各种不同的方式进行测试,我对这个问题非常好奇。我问了一些同事,没有人知道它来自哪里。 无论如何,如果我写过更大的应用程序,我一定会仔细看看Gearman! – 2010-08-09 15:15:35

+0

Beanstalk是另一个很好的工作队列;我在生产代码中使用它,它非常稳定,并且Perl界面易于使用。 – Ether 2010-08-09 16:25:10

相关问题