Закрытие соединения с PHP

Я пытаюсь завершить сценарий, который отправляет надлежащее уведомление обозревателю пользователей, чтобы закрыть соединение, но позволяет серверу обрабатывать запрос. Мой код основан на том, что я видел:

http://www.php.net/manual/en/features.connection-handling.php#71172

а также

закрыть соединение раньше

ob_start(); echo ('Text the user will see'); $size = ob_get_length(); ignore_user_abort(); // optional header('Content-Encoding: none'); header("Content-Length: $size"); header("Connection: close"); // flush all output ob_end_flush(); ob_flush(); flush(); sleep(5); //just a test to see if the script continues to run file_put_contents("trash/".date('dmY-H_i_s_1').".txt", "Some text."); file_put_contents("trash/".date('dmY-H_i_s_2').".txt", "Some text."); file_put_contents("trash/".date('dmY-H_i_s_3').".txt", "Some text."); 

Когда я иду запускать скрипт, иногда он создает первый файл, но не записывает текст в него. Иногда он не создает никаких файлов. Если я запустил скрипт с предыдущим кодом возврата, закомментированным, все три файла будут созданы просто отлично. Сжатие Zlib выключено. Есть идеи?

Related of "Закрытие соединения с PHP"

Правильный способ сделать это – использовать php в режиме fastcgi, а затем вы можете использовать функцию fastcgi_finish_request (); он будет делать именно то, что вам нужно – он закроет соединение с браузером, но остальная часть скрипта будет продолжать работать до конца.

http://php-fpm.org/wiki/Features

Это намного лучше, чем полагаться на буферизацию вывода.

Вы можете настроить свою дополнительную обработку с помощью register_shutdown_function .

В принципе, вы регистрируете что-то, что должно произойти после завершения скрипта и отправки всех результатов пользователю. Таким образом, скрипт может продолжать работать некоторое время после этого, делая какую-либо очистку или что не нужно.

Обновление: мое плохое, что долго не применяется после PHP 4.1

Ссылки, которые вы дали, и другие вещи, которые я нашел, говорят, что вы делаете это правильно. Вы уверены, что не происходит ошибка или тайм-аут сценария? Что делает журнал ошибок PHP?

ignore_user_abort() должен иметь необязательный параметр, чтобы он фактически игнорировал прерывание пользователя. В противном случае он просто возвращает текущий параметр игнорирования, ничего не меняя. так что вам нужно

 ignore_user_abort(true);