Если веб-браузер не закрывает соединение, ваш скрипт, вероятно, будет продолжать работать до тех пор, пока не истечет время ожидания соединения или не достигнет максимального времени выполнения PHP.
Лучшее, что я могу придумать, - это использовать AJAX для регулярного «эхо-запроса» сервера и остановки, если он не получал эти эхо-запросы в течение некоторого времени. Или каждый раз, когда он получает пинг, дайте PHP-скрипту еще 5 секунд для запуска.
Или вы можете попробовать использовать AJAX для отправки сообщения на сервер, когда пользователь закрывает окно, но я думаю, что эта возможность отключена в некоторых новые браузеры, потому что он часто используется для назойливой всплывающей рекламы и т. д.
Когда вы опробовали эти методы, вы заставляли PHP очищать буфер? Пока что-то не будет написано из сценария, PHP / Apache не сможет увидеть, подключен ли клиент. Имейте в виду, что PHP не взаимодействует напрямую с клиентом - он взаимодействует с Apache.
Комментарии в нижней части connection_aborted PHP manual содержат несколько стратегий.
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();
}