У меня есть код 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_ * не подходит для этого.