обнаружение прерывания пользователя с включенной буферизацией в PHP - PullRequest
3 голосов
/ 11 марта 2011

Раздел «Примечания» в документации по функции функции ignore_user_abort () предполагает, что PHP не может обнаружить, что пользователь прервал запрос, если клиенту не было отправлено никаких данных.Это верно и для функции connection_status().К сожалению, мне нужно обнаружить прерывание пользователя (ajax-запрос, который можно отменить) на странице, использующей буферизацию вывода (и я не могу это легко изменить).

Есть ли какой-либо другой способ обнаруженияпользователь прерван, за исключением использования функции connection_status()?Или какой-то конкретный способ заставить эту функцию возвращать правильное значение?На самом деле PHP должен знать, что запрос был прерван, поскольку от клиента получен пакет FIN.

Я уже пытался проанализировать метаданные stream из php://input, php://output, php://stdin и php://stdout после чтения / записи данных блокирующим и неблокирующим способом до и после разрыва соединения, но это не обеспечило каких-либо полезных изменений состояния.

1 Ответ

1 голос
/ 11 марта 2011

Глупое предложение, но ... вы пытались отправить некоторые данные клиенту, после чего flush(), прежде чем начать буферизацию вывода?Единственное другое решение, которое я могу придумать, - это избежать буфера (ов), но я могу себе представить, как это может быть довольно проблематично, как вы сказали.

Может быть, помощник, помогающий разбить буфер ...

function OBWanCallback($buffer)
{
    if( OBWan::$isFinished )
    {
        // -- Actual callbacks go here ...
    }

   return $buffer;
}

OBWan::startbuffer('OBWanCallback');
[ // -- Example functionality
    self::$callback = $callback;
    ob_start(self::$callback);
]

// -- in some code far, far away ...

OBWan::suspendbuffer();
[ // -- Example functionality
    self::$buffercache = ob_get_clean();
]

echo " ";
flush();

OBWan::resumebuffer();
[ // -- Example functionality
    ob_start(self::$callback);
    echo self::$buffercache;
    self::$buffercache = "";
]

// -- in some code far, far away ...

OBWan::outputbuffer();
[
    self::$isFinished = true;
    return ob_get_clean();
]

с чем-то, что учитывает глубину буферов, которые вы внедрили, если вы реализовали глубину.

...