connection_aborted () не работает для вызовов ajax

РЕДАКТИРОВАНИЕ

У меня есть вызов 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, даже если я явно отправил строку и сбросил буфер!

Кто-нибудь есть ответ здесь, пожалуйста?

Solutions Collecting From Web of "connection_aborted () не работает для вызовов ajax"

Вам нужно будет добавить «ignore_user_abort (true)»; поверх сценария PHP и вызвать «ob_flush ()» после повторения чего-либо из сценария (для чего см. страницу PHP flush () man ). Рабочий пример (доказательство концепции):

 <?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. где требуется вызов flush () до 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