我已经实现了一个大约需要30秒或更长时间的文件优化脚本。有一个循环,我添加了回声来跟踪正在处理的内容。
但是,大多数情况下,直到过程结束,才发送任何输出。
我如何控制这一点,以便在迭代完成时发送回声?
编辑:
这是隐含的代码,具有输出缓冲功能:
set_time_limit(60);
ini_set("memory_limit", "256M");
$documents = $this->documents_model->get($date1, $date2);
ob_start();
echo '-- Start ' . "<br>'n";
ob_end_flush();
flush();
foreach ($documents as $document) {
ob_start();
echo '-- Processing document ' . $document->id . "<br>'n";
$file = $document->get_file_name();
if (! $file || ! file_exists(DOCUMENT_ROOT . 'documents/' . $file)) {
echo '---- Document ' . $document->id . " has no PDF file yet or it was deleted<br>'n";
$path = $this->documents_model->generatePDF($document);
echo '------ file generated: ' . $path;
}
ob_end_flush();
flush();
}
echo '-- End ' . "<br>'n";
处理完成后将获得输出的原因是php的输出缓冲区,最终是Web服务器的缓冲区。
在每隔几条echo
语句之后,您将不得不通过调用ob_flush()
和flush()
来刷新这些缓冲区。
有关更多技术信息,请参阅PHP缓冲区ob_flush()与flush()