Использование буферизации вывода PHP для устранения ошибки JavaScript во время обработки

У меня есть код PHP, который принимает и обрабатывает большие изображения. Я хотел бы повторить некоторый JavaScript в определенных точках, пока изображение обрабатывается, чтобы обновить DOM с помощью jQuery. Вот пример кода, но он не работает. Он просто ждет целых 5 секунд, а затем делает предупреждения повторяющимися. Я хочу, чтобы он сделал первое предупреждение сразу, а затем следующее предупреждение через 5 секунд.

ob_start(); echo '<script type="text/javascript">alert(\'1...\');</script>'; ob_flush(); sleep(5); ob_start(); echo '<script type="text/javascript">alert(\'2...\');</script>'; ob_flush(); 

Может ли кто-нибудь помочь?

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

Также: вы должны вызывать flush , а не только ob_flush, и убедитесь, что сжатие zlib отключено .

У меня есть код PHP, который принимает и обрабатывает большие изображения. Я хотел бы повторить некоторый JavaScript в определенных точках, пока изображение обрабатывается, чтобы обновить DOM с помощью jQuery.

Это может быть вне сферы видимости для того, что вам нужно сделать, но я бы использовал AJAX для этого. Вы, конечно же, можете получить то, что хотите, но этот подход не очень хорош в долгосрочной перспективе.

Вместо того, чтобы отправлять всю страницу и ждать ее возврата при обходе, используйте запрос AJAX для загрузки изображения и получения результата. Затем таймер на клиенте может выпускать отдельный AJAX «как далеко вы сделали?» Запросы. Два экземпляра PHP свяжутся, установив флаг «done» в записи задания в базе данных и т. Д.

Хотя это делает клиентскую часть немного более сложной, гораздо проще обрабатывать взаимодействие с пользователем (например, позволяя пользователю отменить длительное задание) и делает ваш PHP-код намного более тесно ориентированным.

Добавление этого в начало скрипта будет работать:

 for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); } ob_implicit_flush(1); 

Насколько мне известно, ob_implicit_flush(1) заставляет флеш в каждом выводе. Таким образом, другие вызовы ob_flush() ob_start() и ob_flush() не нужны. Я не знаю, работает ли это для вас.

 <?php for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); } ob_implicit_flush(1); echo '<script type="text/javascript">alert(\'1...\');</script>'; sleep(5); echo '<script type="text/javascript">alert(\'2...\');</script>'; ?> 

Следующее работает в FF4:

 <?php echo '<script type="text/javascript">alert("1");</script>'; flush(); sleep(5); echo '<script type="text/javascript">alert("2");</script>'; ?> 

Я реализовал чат-сервер с чем-то подобным давно. Он работал.

Этот предмет ob_ * не подходит для этого.