EDITED
我有一个Ajax调用(使用$.ajax()
它调用下面的PHP脚本。
for ($i=0;$i<40;$i++) {
echo " ";
flush();
if (connection_aborted()) {
log_message('error','CONNECTION IS ABORTED!!!!!');
exit;
}
else {
log_message('error','connection not aborted :(');
}
sleep(1);
}
这同样适用于40秒。
如果我关闭其触发调用,浏览器窗口connection_aborted()
仍然返回false, 即使我发出明确的字符串,并刷新缓冲区!
有没有人有答案在这里吗?
您将需要添加“ignore_user_abort(真正的);” 在PHP脚本的顶部,并呼吁“使用ob_flush()”相呼应,从脚本的东西后(为什么看到PHP冲水()手册页 )。 工作示例(概念验证):
<?php
ignore_user_abort(true);
function log_message($s, $ss) {
$myFile = "log.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = $s . ": " . $ss . "\n";
fwrite($fh, $stringData);
fclose($fh);
}
for ($i=0;$i<5;$i++) {
echo "<br>";
//flush();
ob_flush();
if (connection_aborted()) {
log_message('error1', connection_status());
exit;
}
else {
log_message('error2', connection_status());
}
sleep(1);
}
PS CONNECTION_STATUS()返回0,如果连接仍然有效,并且在封闭的情况下返回1。
编辑:
我的错。 通话双方的flush()和使用ob_flush()(请刷新阅读()手册页,上面的链接,并从回答这个话题 ),否则可能无法正常工作,这取决于服务器/ PHP配置。 下面的代码在WAMP测试用PHP 5.3.8(不调用工作的flush()),现在在Ubuntu用PHP 5.3.10。 其中使用ob_flush之前冲洗()调用()是必要的。
用于测试的完整代码:
index.html的:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<script>
$(document).ready(function() {
$.ajax({
url: "script.php",
context: document.body
}).done(function(data) {
alert(data);
});
})
</script>
</head>
<body>
</body>
</html>
script.php的:
ignore_user_abort(true); function log_message($type, $message, $file = 'log.txt') { $fh = fopen($file, 'a') or die("can't open file"); $conn_status = connection_status(); if($conn_status === CONNECTION_NORMAL) { $status = 'normal'; } elseif($conn_status === CONNECTION_ABORTED) { $status = 'aborted'; } else { $status = 'timeout'; } $aborted = connection_aborted() ? 'yes' : 'no'; $data = $type . ': ' . $message . "\n"; $data .= 'Connection status: ' . $status . "\n"; $data .= 'Aborted: ' . $aborted . "\n\n\n"; fwrite($fh, $data); fclose($fh); } for ($i = 0; $i < 10; $i++) { echo "<br>"; flush(); ob_flush(); if (connection_aborted()) { log_message('Error', 'Connection closed by user!'); exit; } else { log_message('Info', 'Everything is fine. Move along...'); } sleep(1); }
你叫的index.html页,并关闭选项卡或整个浏览器后,你应该在log.txt文件下一信息,请参阅:
Info: Everything is fine. Move along...
Connection status: normal
Aborted: no
Info: Everything is fine. Move along...
Connection status: normal
Aborted: no
Info: Everything is fine. Move along...
Connection status: normal
Aborted: no
Error: Connection closed by user!
Connection status: aborted
Aborted: yes