我有一个脚本可以在更长的时间内执行多个操作。在标准情况下,PHP脚本的输出在完全执行此脚本后发送。如果我的脚本加载很长时间没有任何响应,用户可能会失望。
假设我在这个脚本中有一个循环,它将工作10次。
每次执行后,我想要输出到浏览器"Element X finished. Y time."
。 X和Y的值将会改变。
有没有办法达到这个效果?也许从这个脚本到新脚本的某种调用,它将通过AJAX将数据发送到浏览器。
或者有没有办法只用PHP实现来达到这个效果?
我看到我必须澄清此事。我希望此信息在页面上动态显示。我已经尝试了输出缓冲区功能,但它仍然无法正常工作。完全执行脚本后,将显示浏览器中的输出。测试代码:
for ($i = 0; $i <= 10; $i++) {
ob_start();
echo "Output " . $i . "<br />";
ob_flush(); //also only flush() etc.
sleep(1);
}
答案 0 :(得分:6)
是的,仅使用PHP就可以实现。我记得看到一些与此相关的代码,当我在一段时间内通过wordpress进行追踪时,当它更新模块时,它必须ftp,解压缩,复制文件等,这需要很长时间,并且它喜欢让用户更新目前正在做什么......在检查了他们的send_message()函数并阅读PHP ob_flush()页面后,我认为你想要:
echo "stuff\n"; // adding a newline may be important here,
// a lot of io routines use some variant of get_line()
ob_end_flush(); // to get php's internal buffers out into the operating system
flush(); // to tell the operating system to flush it's buffers to the user.
php手册中的人员还暗示,在其中显式设置带有mime类型和字符集的header()可能会有所帮助,因此浏览器会在开始时知道它并且不会等待整个二进制对象在尝试decypher之前变为可用的。
如果这不起作用,您需要进一步修改系统php.ini以关闭输出缓冲和压缩,此时您还可以查看ajax解决方案。
ajax解决方案看起来像:
你的脚本吐出一些html / javascript来点击ajax请求,刷新所有缓冲区,并停止与用户有关,然后开始一些操作,或者可能只是表明某个大型操作是在某个地方的数据库中开始为了获得一份cron工作。页面上的javascript将有一个计时器循环来轮询ajax端点的状态,直到ajax回复它已完成。 ajax端点将通过查询数据库或检查输出文件等来检查任务的状态,并立即吐出所有已知的并终止,让客户决定何时再次询问。这是一个涉及更多活动部件的更多参与和复杂的活动,但如果值得花时间制作,则为用户提供非常好的最终产品。
答案 1 :(得分:3)
在代码输出flush();
"Element X finished. Y time."
默认情况下,PHP会将所有输出存储在输出缓冲区中,直到它准备好发送到浏览器。 <{1}}和flush()
强制输出。
答案 2 :(得分:1)