已编辑
我有一个ajax调用(使用$.ajax()),它调用以下php脚本。
$.ajax()
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 !
connection_aborted()
请问有人在这里回答吗?
您将需要添加“ ignore_user_abort(true);” 在PHP脚本之上,并在从脚本中回显某些内容后调用“ ob_flush()”(有关原因,请参见 PHP flush()手册页 )。工作示例(概念验证):
<?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()(请阅读flush()手册页,上面的链接,以及 本主题的),否则可能不起作用,具体取决于服务器/ 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