我有一个 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,那么我就有时间对这个脚本进行更彻底的重写。
答案1
你需要把任何工作必须即使浏览器关闭/后台作业中连接终止,也会发生这种情况。使用工作队列(我喜欢 resque,但实际上任何东西都可以)和作业处理器来检索作业并进行必要的插入。有关编写该代码的问题最好在 stackoverflow 上提问。
答案2
在 Unix 服务器上,你可以在 perl 脚本中尝试忽略信号,例如,
$SIG{'TERM'}='IGNORE';
$SIG{'HUP'}='IGNORE';
$SIG{'PIPE'}='IGNORE';
如果您正在运行 Windows 服务器,这可能没有帮助。
在 unices 上,这可能会引发其他问题。