Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端浏览器关闭时中断服务器端perl CGI脚本_Perl_Cgi_Client_Apache - Fatal编程技术网

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

客户端浏览器关闭时中断服务器端perl CGI脚本,perl,cgi,client,apache,Perl,Cgi,Client,Apache,我已经试着解决一个小问题很长一段时间了,但似乎我不能 我编写了一个HTML页面,在提交表单时调用perl CGI脚本。这个CGI在服务器端执行一定数量的任务,我让脚本将这些任务的步骤打印到HTML页面上的iframe中。问题是,如果客户端关闭浏览器或刚离开页面,CGI脚本在服务器端被中断 HTML代码: <form action="/path/to/script.cgi" method="post" enctype="multipart/form-data" target="process

我已经试着解决一个小问题很长一段时间了,但似乎我不能

我编写了一个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>
假设“function1”只是为文件分析准备了一些东西(创建文件夹等)。 “功能2”是最大的功能(可能持续15分钟)。这是一个perl程序,它有很多“打印”,由于CGI的“text/plain”头,这些打印被重定向到html页面的iframe中(在程序中不使用缓冲$|)。httpd的配置使得超时时间远远超过15分钟,因此它不会从那里出现。 “功能3”是清理

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

我试着用一个系统命令作为一个独立程序启动“function2”,或者创建一个perl库并调用这个库的主函数,结果仍然是一样的。 我认为无论客户端是否留在页面上,服务器端脚本都会一直运行。是因为CGI脚本的“text/plain”头不能返回到客户端,所以脚本被中断了吗


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

您需要以不同的方式构建软件。使用某种异步编程,作业队列就可以了,而使用CGI程序只是将作业放入队列。使用前面提到的库进行转换

您似乎不熟悉这个概念,因此我推荐一个非常简单的概念:。如果您觉得它限制太多,请切换到,我认为这是Perl世界中最流行的一种(请参阅接口和)


TIMTOWTDI:如果您可以完全放弃CGI.pm提供的执行环境,请参见。例如,

提供了一种简单的方法来解决此问题。

感谢您的回复Daxim,“TIMTOWTDI”:没错,但是我的应用程序是线性的。即使我运行的程序相当大,我也不需要多任务。此外,我真的很想了解我的CGI脚本发生了什么。我一直在用各种不同的方法测试它,我真的很好奇这个问题。我问了我的一些同事,没有人知道它来自哪里。无论如何谢谢你,如果我写了一个更大的应用程序,我一定会仔细看看Gearman!Beanstalk是另一个很好的工作队列;我在生产代码中使用它,它非常稳定,Perl接口也很容易使用。问题似乎来自我的“function2”中的系统调用命令。我尝试调用其他没有系统命令的函数,即使客户端没有响应,CGI脚本也会一直运行。我还尝试删除CGI头,脚本也运行得很好。我猜是系统调用和CGI将标准输出实时刷新回客户端这两个事实的结合导致了错误的发生。。。
my $query = new CGI;
print $query->header(-type => 'text/plain');
function1();
function2_takesLongTime($parameter);
function3();