PHP connection_aborted () не работает правильно - PullRequest
2 голосов
/ 17 июня 2011

У меня есть следующий код:

ignore_user_abort(true);
while(!connection_aborted()) {
    // do stuff
}

и согласно документации PHP это должно выполняться до тех пор, пока соединение не будет закрыто, но по какой-то причине этого не происходит, вместо этого оно продолжает работать до истечения времени ожидания сценария. Я посмотрел онлайн и некоторые рекомендовали добавить

echo chr(0);
flush();

в петле, но это, похоже, тоже ничего не делает. Еще хуже, если я просто оставлю это как

while(true) {
    // do stuff
}

PHP все еще продолжает запускать скрипт после отключения клиента. Кто-нибудь знает, как заставить это работать? Есть ли настройка php.ini, которую я где-то упускаю?

Если это имеет значение, я использую PHP 5.3.5. Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Попробуйте:

    ignore_user_abort(true);

    echo "Testing connection handling";

    while (1) {
            if (connection_status() != CONNECTION_NORMAL)
                    break;
            sleep(1);
            echo "test";
            flush();
    }
1 голос
/ 22 июня 2011

Попробуйте использовать ob_flush(); непосредственно перед flush();, и некоторые браузеры просто не обновят страницу, пока не будут добавлены некоторые данные.

Попробуйте сделать что-то вроде

<? php
// preceding scripts

ignore_user_abort(true);

$i = 0;

while(!connection_aborted())
{ $i++;
  echo $i;

  echo str_pad('',4096); // yes i know this will increase the overhead but that can be reduced afterwords

  ob_flush();

  flush();

  usleep(30000); // see what happens when u run this on my WAMP this runs perfectly
}

// Ending scripts
?>

Google Chromeна самом деле имеет проблемы с этим кодом;он не очень хорошо поддерживает потоковую передачу.

0 голосов
/ 18 августа 2011

достаточно неудачно, у меня output_buffering = Off и в любом случае мой цикл while продолжает работать, а connection_aborted () выдает 0, даже если клиент закрыл браузер.Любые другие советы?

...