@marliotto

Почему php-fpm не останавливается при отмене соединения?

Проверяю следующим скриптом
<?php

ignore_user_abort(false);

echo 'message';

sleep(8);

while(ob_get_level()) {
ob_end_flush();
}

$status = connection_status();

if ($aborted = connection_aborted()) {
    file_put_contents(__DIR__ . '/a', date('d.m.Y H:i:s') . ' - aborted (' . $aborted . '); Status - ' . $status);
    echo 'aborted';
} else {
    file_put_contents(__DIR__ . '/a', date('d.m.Y H:i:s') . ' - connected (' . $aborted . '); Status - ' . $status);
    echo 'connected';
}


Всегда скрипт отрабатывается полностью и connection_aborted() === 0.

Пробовал в nginx играться с опцией fastcgi_ignore_client_abort.
При значении off в лог nginx попадает 499 ошибка, но скрипт все равно выполняется до конца и connection_aborted() === 0.

Как сделать, чтобы php знал отвалился клиент или нет?

Версия nginx 1.6.2
Версия php PHP/5.4.45

UPD: Проблема не в запросе, он быстрый.
Проблема в медленных клиентах с плохим интернет соединением.
Мне нужно знать, что они отказались ожидать ответа.
  • Вопрос задан
  • 1039 просмотров
Решения вопроса 1
@marliotto Автор вопроса
Заработало только при socket соединении.
Так же PHP узнает об обрыве соединения, только после отправки данных клиенту (через echo, header) и сбрасывании буфера.
Код будет следующим
<?php

//Работает только при socket соединении
//необходимо выставить в true. Иначе после вывода данных выполнение скрипта прервется
ignore_user_abort(true);

sleep(8);

echo 'message';
flush();//только теперь php знает, оборвалось соединение или нет

$status = connection_status();

if ($aborted = connection_aborted()) {
    file_put_contents(__DIR__ . '/a', date('d.m.Y H:i:s') . ' - aborted (' . $aborted . '); Status - ' . $status);
    echo 'aborted';
} else {
    file_put_contents(__DIR__ . '/a', date('d.m.Y H:i:s') . ' - connected (' . $aborted . '); Status - ' . $status);
    echo 'connected';
}


Ссылки по теме
stackoverflow.com/a/25251852
php.net/manual/ru/function.ignore-user-abort.php (смотреть примечание)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
ваш путь в никуда откажитесьб от этого говнокода и сделайте все нормально , а не костыль на костыле.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы