Назад | Перейти на главную страницу

Убить процесс PHP при закрытии соединения

Я отправил в SO следующий вопрос, но подумал, что может быть серверное решение.

https://stackoverflow.com/questions/9053964/php-script-with-sleep-does-not-exit-on-connection-close

Я использую Ubuntu VPS для запуска этого скрипта, и я пытаюсь заставить скрипт умереть, когда пользователь закрывает окно / вкладку своего браузера.

Есть несколько функций на основе PHP, чтобы увидеть, открыто ли соединение, но ни одна из них не работает (поверьте мне, протестировал их все).

Может быть, есть какие-нибудь творческие идеи о том, как я могу это сделать через сервер?

https://stackoverflow.com/questions/23530820/php-connection-aborted-does-not-always-works/29401757#29401757

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 для отправки сообщения на сервер, когда пользователь закрывает окно, но я думаю, что эта возможность отключена в некоторых новых браузерах, потому что она часто используется для раздражающих всплывающих окон и т. Д.