Я запускаю что-то вроде этого в php
по командной строке:
echo "first sentence";
sleep(5);
echo "second sentence";
При запуске cmd, он печатает первое предложение, через 5 секунд распечатайте второе предложение. Но когда я запускаю веб-браузер, он ждет завершения процесса. Почему это происходит в CMD? Любая идея?
Когда работает
cmd
, он печатает первое предложение, через 5 секунд печатает второе предложение. Но когда я запускаю веб-браузер, он ждет завершения процесса. Почему это происходит вcmd?
Это происходит, когда вы запускаете скрипт, используя CLI, потому что это то, что вы просили сделать. И он работает так же, когда он вызывается веб-сервером.
Разница в том, что при запуске в терминале промежуточный процесс отсутствует. Интерпретатор PHP производит некоторые выходные данные, и терминал отображает их по мере поступления.
В целях оптимизации веб-сервер не отправляет данные обратно в браузер (это может быть наполовину по всей Земле), как только сценарий PHP производит их. Он помещает его в буфер и отправляет в браузер либо после завершения скрипта PHP, либо после заполнения буфера.
Сам интерпретатор PHP использует такой буфер для вывода.
Вы можете заставить PHP отправлять сгенерированный вывод, вызывая flush()
(после каждого echo
, например). Однако это ничего не решает.
Интерпретатор PHP отправляет выходные данные на веб-сервер, но веб-сервер имеет собственный механизм буферизации, который не может управляться из сценария PHP.
Более того, даже если веб-сервер отправляет выходные данные обратно в браузер, браузер решает, использует ли он данные для обновления уже отрисованной страницы или ждет, пока поступят дополнительные данные (или соединение закроется).
Более того, если есть прокси между браузером и сервером, они обычно реализуют свои собственные механизмы буферизации, которые нельзя каким-либо образом убедить очистить свои буферы.
Наконец я нашел ответ. Это хорошо для целей отладки:
@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();