我一直在尝试解决一个小问题很长一段时间,但它似乎我无法。当客户端浏览器关闭时中断服务器端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”标题无法返回给客户端,脚本中断?
如果有人能帮我解决这个问题,我会非常感激。
看来问题来自我的“功能2”中的系统调用命令。我尝试调用其他不具备系统命令的函数,即使客户端没有响应,CGI脚本也会一直运行。我也尝试删除CGI头文件,并且脚本也完美运行。我想这是系统调用和CGI将标准输出实时刷新到客户端的事实,从而导致错误发生...... – 2010-08-09 17:04:32