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(true);”在PHP脚本之上,并在从脚本中回显某些内容后调用“ ob_flush()”(有关原因,请参见PHP flush() man page).工作示例(概念验证):
<?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);
}
附:如果连接仍处于活动状态,则connection_status()返回0,如果关闭则返回1.
编辑:
我的错.调用flush()和ob_flush()(请阅读flush()手册页,上面的链接,以及this topic的答案),否则可能不起作用,具体取决于服务器/ PHP配置.
以下代码已在WAMP和PHP 5.3.8上进行了测试(无需调用flush()即可工作),现在已在Ubuntu PHP 5.3.10上进行了测试.需要在ob_flush()之前调用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。