我有一个 Perl 脚本,由最终用户单击 Web 浏览器中的快捷方式激活。该脚本遍历哈希值列表。当每次迭代向数据库中插入一行时,它会向浏览器输出一些 HTML。环境是 Perl、Windows Server 2003 标准版、IIS。我最近迁移到 Apache。传统上迭代次数很少,大多数用户在页面加载完成后关闭浏览器。现在,我们有一个最多有 5000 次迭代的情况。现在执行这 5000 次迭代需要很长时间(1 分钟~)。那不是问题。问题是当用户关闭 Web 浏览器时,Apache 会终止 Perl 脚本,并且我们没有完成将行插入到数据库中,因为浏览器不会确认最近发送的 html。我在 IIS 下对此进行了测试,在用户关闭 Web 浏览器后,Perl 脚本继续运行并插入所有行。Apache 配置文件中是否有一个设置会强制 Apache 完成运行 Perl 脚本,即使在浏览器关闭并且套接字被删除后也是如此?
这就是我们正在做的事情:
foreach my $Destination (sort keys %{$self->{_Destinations}}) {
print qq! <td $self->{_bgcolor}>$Destination Queued</td> !;
if ($self->{_Data}->Execute(@params)) {&error}
}
我知道我们应该做所有的数据库插入然后做我们的打印,但这是遗留代码,如果我能让 Apache 在这方面表现得像 IIS,那么我将有时间更彻底地重写这个脚本.
即使浏览器关闭/连接在后台作业中终止,您也需要进行任何必须进行的工作。使用工作队列(我喜欢 resque,但实际上任何事情都可以)和作业处理器来检索作业并进行必要的插入。最好在 stackoverflow 上询问有关编写该代码的问题。
在 Unix 服务器上,在您的 perl 脚本中,您可以尝试忽略信号,例如,
如果您正在运行 Windows 服务器,这可能没有帮助。
在 unices 上,这可能会引发其他问题。