Я отправил в SO следующий вопрос, но подумал, что может быть серверное решение.
https://stackoverflow.com/questions/9053964/php-script-with-sleep-does-not-exit-on-connection-close
Я использую Ubuntu VPS для запуска этого скрипта, и я пытаюсь заставить скрипт умереть, когда пользователь закрывает окно / вкладку своего браузера.
Есть несколько функций на основе PHP, чтобы увидеть, открыто ли соединение, но ни одна из них не работает (поверьте мне, протестировал их все).
Может быть, есть какие-нибудь творческие идеи о том, как я могу это сделать через сервер?
TCP требует, чтобы ВСЕ отправленные пакеты подтверждались клиентом, и поэтому сервер должен определять это как минимум как тайм-аут отправки ...
session_write_close();//to make flush work
while (connection_status() !== 0) {//this will work if the connection is properly shutdown
//or if it is simply disconnected...
sleep(1);
echo "whatever";
ob_flush();
flush();
}
Когда вы пробовали эти методы, вы заставляли PHP очищать буфер? Пока что-то не будет написано из сценария, PHP / Apache не сможет увидеть, подключен ли клиент. Имейте в виду, что PHP не взаимодействует напрямую с клиентом - он взаимодействует с Apache.
Комментарии находятся внизу connection_aborted Руководство по PHP содержат несколько стратегий.
Если веб-браузер не закрывает соединение, ваш скрипт, вероятно, будет работать до тех пор, пока не истечет время ожидания соединения или не достигнет максимального времени выполнения PHP.
Лучшее, что я могу придумать, - это использовать AJAX для регулярного «пинга» сервера и остановки, если он не получал эти эхо-запросы в течение некоторого времени. Или каждый раз, когда он получает пинг, дайте PHP-скрипту еще 5 секунд для запуска.
Или вы можете попробовать использовать AJAX для отправки сообщения на сервер, когда пользователь закрывает окно, но я думаю, что эта возможность отключена в некоторых новых браузерах, потому что она часто используется для раздражающих всплывающих окон и т. Д.