Вы можете оборвать запрос со стороны сервера, сказав клиенту что мол данных от вас больше не поступит и соединение можно закрывать. А скрипт после этого продолжит работать и может делать какие-нибудь тяжелые задачи. К сожалению это умеет только php-fpm.
php.net/manual/ru/function.fastcgi-finish-request.php
Эту функцию использует Symfony/HttpFoundation при отправке запроса. Сам же Symfony из коробки отправляет почту к примеру только после этого, так что время отправки сообщений пользователю не влияют на время запроса между клиентом и сервером.
Если же вам нужно как-то отследить что пользователь закрыл TCP сессию (закрыл вкладку, ребутнул комп или просто нажал "стоп"), то PHP об этом узнает, как и сказал
xmoonlight, только при попытке записи (по flush). Что бы все было лучше можно делать проверку используя функцию
connection_aborted().
Так же есть особенности работы web-server-а. Скажем nginx будет держать соединение сколько вы того пожилаете. А вот apache убьет соединение через минуту вне зависимости от настроек PHP (могу ошибаться, давно не имел дела с апачем).