Intereting Posts

php-выход со сном ()

Я пытаюсь запустить цикл каждую секунду в течение 25 секунд в основном.

for($i = 0; $i <= 25; $i += 1){ echo $i; sleep(1) } 

Дело в том, что он не выводится до тех пор, пока он не будет полностью выполнен, поэтому после того, как цикл продолжится 25 раз. Есть ли способ сделать это, чтобы он выдавался перед каждым сном? и не дожидаться завершения полного цикла?

Благодаря!

То, что вы пытаетесь достичь, – это инкрементный вывод в браузер из PHP.

Возможно ли это, может зависеть от вашего сервера и от того, как вы вызываете PHP.

PHP в FastCGI

Вероятно, вы скорее столкнетесь с такой проблемой, когда PHP работает под FastCGI, а не как модуль Apache, потому что связь между сервером и процессами PHP не так тесно связана. Коммуникация FastCGI использует буферизацию вывода после того, как данные оставили процессы PHP, причем вывод отправлен в браузер только после полного завершения запроса или заполнения этого буфера. Вдобавок к этому, процессы PHP, как правило, прекращаются через определенное количество времени, чтобы не позволить кому-либо работать слишком долго.

Тем не менее, комбинация ob_end_flush() (или ob_flush() ) и flush() все равно должна заставить PHP запрашивать flush() буферов в нисходящем направлении, так что это может по-прежнему работать. Возможно, вам также потребуется выяснить, нужно ли вам ограничивать время для скриптов PHP.

PHP в mod_php

Если вы используете mod_php, вы можете писать поэтапно в браузере. Используйте команду flush (), чтобы убедиться, что модуль PHP мгновенно очистит ее. Если у вас нет буферизации вывода или какого-либо модуля Apache, такого как mod_gzip, он должен немедленно выйти в браузер пользователя. Более того, вы можете поддерживать свой PHP-скрипт до тех пор, как вам нравится (с помощью set_time_limit () в PHP), в соответствии с конфигурациями по умолчанию, хотя, конечно, он будет потреблять некоторую память.

У вас могут возникнуть проблемы с некоторыми браузерами, которые не начинают рендерить страницу до тех пор, пока не будет загружена определенная часть страницы. Некоторые версии IE могут ждать 1 КБ. Я обнаружил, что Chrome может ждать больше. Множество людей обойти это, добавив дополнение, например длинный комментарий 1 или 2 КБ в верхней части документа.

Вызов flush заставит PHP вытолкнуть весь выходной буфер на клиент, прежде чем продолжить.

 for($i = 0; $i <= 25; $i += 1){ echo $i; flush(); sleep(1); } 

РЕДАКТИРОВАТЬ:

После тестирования этого на моем сервере lighttpd я заметил, что он буферизует мои выходы блоками из 4096 символов, и я предполагаю, что у другого браузера могут быть аналогичные схемы буферизации. Также GZIP может полностью предотвращать flush . К сожалению, нет способа проверить, что он работает из-за характера HTTP.

Еще одна проблема с этой стратегией заключается в том, что она оставляет блокировку PHP proc для других запросов. Это может привести к сбоям запросов.

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

 <?PHP ob_start(); $buffer = str_repeat(" ", 4096)."\r\n<span></span>\r\n"; for ($i=0; $i<25; $i++) { echo $buffer.$i; ob_flush(); flush(); sleep(1); } ob_end_flush(); ?> 

Вопросы, которые вы можете задать, могут быть здесь (около \r\n ) и здесь (об ob_flush() ). Надеюсь, что это поможет тебе.