【发布时间】:2014-06-17 03:34:53
【问题描述】:
有没有办法让HTTP::Daemon 以某种方式检测客户端何时断开连接(例如由于超时)并随后杀死自己?
现在,这就是我编写服务器的方式:
my $response;
try {
local $SIG{ALRM} = sub { die __TIMEOUT__ };
alarm 180;
&process_query;
alarm 0;
$response = new HTTP::Response(200);
}
catch {
if ( $_ eq __TIMEOUT__ ) {
$response = new HTTP::Response(504);
}
else {
$response = new HTTP::Response(500);
}
};
$client->send_response($response);
这只是假设客户端将在 180 秒后放弃,这可能是真的,也可能不是。只要客户一直在等待响应,我就想继续处理,但不会再等了。
【问题讨论】:
-
@Miller,
process_query会根据查询参数进行一些繁重的处理,这可能需要几秒钟到几小时之间的任何时间。但我不介意,只要客户愿意礼貌地等待。基于服务器的超时的问题是,如果它太低,客户端可能无法在它准备等待时得到它的答案,但如果它太高,我的服务器可能会继续进行大量计算(并处理额外的传入查询速度较慢)一劳永逸。
标签: perl timeout http-daemon