Окончательное обновление
Похоже, я сделал очень простую ошибку. Поскольку у меня уже есть реализация потока, я не могу начать чтение из потока: D
Я пытаюсь достичь огненно-забытого подобного функционала в PHP.
с php.net
<?php
ignore_user_abort(true);
header("Content-Length: 4");
header("Connection: Close");
echo "abcd";
flush();
sleep(5);
echo "Text user should not see"; // because it should have terminated
?>
Это работает, если я открываю скрипт в браузере. (показывает «abcd»).
Но если я открою его с помощью file_get_contents
или какой-нибудь библиотеки stream , он будет ждать около 5 секунд и покажет второй текст.
Я использую PHP 5.2.11 / Apache 2.0
Обновление
Мне кажется, что я не совсем понимаю, чего я пытаюсь достичь.
Я не хочу скрывать вывод, используя выходные буферы (это глупо). Я хочу, чтобы клиент завершил свою работу до того, как сервер запустит, возможно, длительный процесс (sleep(5)
), и я не хочу, чтобы клиент ждал его (это то, что означает «забей и забудь», сортируйте).
Использование выходных буферов является лишь побочным эффектом. Я исправил пример кода без использования выходных буферов.
Что я не понимаю, так это: почему этот скрипт ведет себя по-разному при доступе к нему из браузера и при извлечении его в PHP с file_get_contents("http://dev/test.php")
или некоторой stream библиотекой? Что я видел в тестировании, так это то, что, например, stream_get_contents
будет на самом деле блокироваться на 5 секунд, прежде чем он вообще выдаст какие-либо выходные данные, что является полной противоположностью того, что я хочу.
Update2
Еще несколько результатов:
- Браузер как-то реагирует на
flush()
. Я не могу понять, как повторить это поведение с streams в PHP, мои потоки продолжают блокировать.
- Я попробовал
fread
и обнаружил, что он ведет себя подобно stream_get_contents
.
- Указание
maxlength
не имеет никакого эффекта, оно будет блокироваться в течение ~ 5 секунд.
- Изменение режима блокировки не имеет никакого эффекта (кроме генерации множества вызовов
to stream_get_contents()
). Он будет ждать ~ 5 секунд, прежде чем что-либо вернуть.
stream_set_read_buffer
не имеет никакого эффекта (проверено на сервере PHP 5.3.5)