PHP - 如何在执行脚本时获得部分输出?

Xar*_*lus 5 javascript php

描述:

我有一个脚本,可以在更长的时间内执行多个操作.在标准情况下,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);
}
Run Code Online (Sandbox Code Playgroud)

小智 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.
Run Code Online (Sandbox Code Playgroud)

php手册中的人员也暗示可能有助于显式设置带有mime类型和字符集的header(),因此浏览器会在开始时知道它并且不会等待整个二进制对象在试图使它具有什么样的实体之前变得可用.

如果这不起作用,你需要进一步修改你的系统php.ini以关闭输出缓冲和压缩,此时你可以去看看ajax解决方案.

ajax解决方案看起来像:

你的脚本吐出一些html/javascript命中ajax请求,刷新所有缓冲区,并停止与用户有关,然后启动一些操作,或者可能只是表明某个大型操作是在数据库的某个地方为cron启动找工作.页面上的javascript将有一个计时器循环来轮询ajax端点的状态,直到ajax回复它已完成.ajax端点将通过查询数据库或检查输出文件等来检查任务的状态,并立即吐出所有已知的并终止,让客户决定何时再次询问.这是一个涉及更多活动部件的更多参与和复杂的活动,但如果值得花时间制作,则为用户实现了非常好的最终产品.