【发布时间】:2010-08-09 13:59:03
【问题描述】:
我一直在尝试解决一个小问题,但似乎我无法解决。
我编写了一个 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();
所以可以说“function1”只是为文件分析做一些准备(创建文件夹等)。 “function2”是大函数(可能持续 15 分钟)。它是一个 perl 程序,它有很多“打印”,由于 CGI 的“text/plain”标头,它们被重定向到 html 页面的 iframe(在程序中不使用缓冲 $|)。 httpd 被配置为超时时间远超过 15 分钟,因此它不会来自那里。 “function3”正在清理。
如果客户端停留在 html 页面上,则 CGI 脚本会完美运行。 如果客户端停止(例如用户关闭窗口),函数 1 和 2 在服务器端执行,但此后脚本似乎被中断,因为没有进行清理。
我尝试使用系统命令将“function2”作为独立程序启动,或者创建一个 perl 库并调用该库的 main 函数,它仍然以相同的方式结束。 我认为无论客户端是否停留在页面上,服务器端脚本仍然会一直运行。是不是因为CGI脚本的“text/plain”头部无法返回给客户端导致脚本中断?
如果有人能帮我解决这个问题,我将不胜感激。
【问题讨论】:
-
看来问题出在我的“function2”中的系统调用命令。我尝试调用其他不具备系统命令的函数,即使客户端没有响应,CGI 脚本也会一直运行。我还尝试删除 CGI 标头,脚本也可以完美运行。我想这是系统调用和 CGI 将标准输出实时刷新回客户端这一事实的结合,导致错误发生......