检测来自PHP的android java客户端连接超时
我从使用java的android设备连接到使用DefaultHttpClient运行PHP的服务器。检测来自PHP的android java客户端连接超时
我正在做的一个测试是检查,如果服务器需要长时间发送数据,java代码会正常处理自身。如果确实需要很长时间,则会断开连接并重试。
目前我有设置在连接超时时间为3秒:
HttpConnectionParams.setSoTimeout(httpParameters, 3000);
在PHP脚本处于睡眠状态,持续10秒服务器:
sleep(10);
Java代码的工作,如果脚本需要3秒以上的时间,然后抛出一个java.net.SocketTimeoutException,然后在少量时间后重试。
PHP脚本继续运行,它是而不是我想要的。我试过在睡眠函数后直接使用connection_aborted进行测试,但它没有捕获已经发生的客户端断开连接。
ignore_user_abort(true);
sleep(10);
print "black hole";
flush();
if(connection_aborted()!=0){
// You would think this works but it does not.
}
建议如何处理?
不知道现在是否一样,但很久以前我碰到php没有意识到连接被中止,直到它实际上试图写入或刷新其输出缓冲区。看到PHP的flush()和ob_flush();我不需要真正写任何输出,只需清空空缓冲区就足以让它检查。
我会想象web服务器和其他东西在php前面可能会影响这种行为。
您可能需要已经调用ignore_user_abort(true);否则php可能会在flush()调用时停止执行(默认行为是在它意识到连接消失时停止),所以你的if语句永远不会被执行。
print
"black hole";
flush();
if(connection_aborted()!=0){
// You would think this works but it does not.
}
实际上,你不会认为这会起作用,因为它需要php脚本才能到达脚本中的那一点。如果你在最后写了它,那么脚本必须按照它的方向运行。
我反而建议:
for($i=0;$i<10;$i++){
echo ' '; ## echo "\0"; might also work
flush();
if(connection_aborted()!=0){
// You would think this works but maybe it will now.
die();
}
sleep(1); # the sleep should come after the check
}
试试看吧。显然,你正在试图睡10秒,然后杀死脚本......在所有情况下,脚本将运行10秒。
我在不久之前写了一篇关于这个主题的文章,我会在这里给出一个简短的答案,并且假设也可以发布相关链接?
从本质上讲,只有在它试图使用连接到该远程套接字的套接字时,PHP才会发现远程客户端已断开连接,直到您要求它对该套接字执行任何操作时,它会认为一切正常。下面是我用它来检查远程断开代码:
public function isAlive(){
$res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK);
if($res === 0){
return false;
}else{
return true;
}
}
这里最重要的部分是MSG_PEEK停止被清除任何未决的消息,而“@”静音错误,如果插座是好的,但没有消息未处理的。
对于完整的文章,这是可以在这里找到:
问候, 菲尔,
不错的文章阅读和谢谢你的答案。我已经推出了代码,因此可能需要一些时间来全面测试您的想法。 – zaf
什么相关的PHP代码是什么样子? – Phil
@在一条简单的线上睡10秒。 – zaf
@Phil我已经用connection_aborted添加了我的尝试 – zaf