gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:26:08 25 4
gpt4 key购买 nike

很长一段时间以来,我一直在尝试解决一个小问题,但似乎做不到。

我写了一个 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” header ,这些打印被重定向到 html 页面的 iframe(在程序中不使用缓冲 $|)。 httpd 配置为超时时间远远超过 15 分钟,因此它不会来自那里。“function3”是清理。

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

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

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

最佳答案

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

你好像不太熟悉这个概念,所以我推荐一个很简单的:Qudo .如果您觉得限制太多,请切换到 Gearman ,我认为它是 Perl 世界中最流行的(参见接口(interface) Gearman::XSGearman)。

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

关于perl - 客户端浏览器关闭时中断服务器端 perl CGI 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com