асинхронный — скрипт оболочки php не ждет завершения процесса

Я запускаю что-то вроде этого в php по командной строке:

echo "first sentence";
sleep(5);
echo "second sentence";

При запуске cmd, он печатает первое предложение, через 5 секунд распечатайте второе предложение. Но когда я запускаю веб-браузер, он ждет завершения процесса. Почему это происходит в CMD? Любая идея?

-1

Решение

Когда работает cmd, он печатает первое предложение, через 5 секунд печатает второе предложение. Но когда я запускаю веб-браузер, он ждет завершения процесса. Почему это происходит в cmd?

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

Разница в том, что при запуске в терминале промежуточный процесс отсутствует. Интерпретатор PHP производит некоторые выходные данные, и терминал отображает их по мере поступления.

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

Сам интерпретатор PHP использует такой буфер для вывода.

Вы можете заставить PHP отправлять сгенерированный вывод, вызывая flush() (после каждого echo, например). Однако это ничего не решает.

Интерпретатор PHP отправляет выходные данные на веб-сервер, но веб-сервер имеет собственный механизм буферизации, который не может управляться из сценария PHP.
Более того, даже если веб-сервер отправляет выходные данные обратно в браузер, браузер решает, использует ли он данные для обновления уже отрисованной страницы или ждет, пока поступят дополнительные данные (или соединение закроется).

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

0

Другие решения

Наконец я нашел ответ. Это хорошо для целей отладки:

@ini_set('zlib.output_compression', 1);
@ini_set('implicit_flush', 1);
@ob_end_clean();
set_time_limit(0);
ob_implicit_flush(1);
ob_end_flush();

echo "first sentence";
sleep(5);
echo "second sentence";

ob_start();
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector