Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在脚本执行时获得部分输出? 说明:_Php_Javascript - Fatal编程技术网

Php 如何在脚本执行时获得部分输出? 说明:

Php 如何在脚本执行时获得部分输出? 说明:,php,javascript,Php,Javascript,我有一个脚本,可以在更长的时间内执行多个操作。在标准情况下,PHP脚本的输出在完全执行该脚本后发送。如果我的脚本加载很长时间而没有任何响应,用户可能会失望 要解决的问题: 假设我在这个脚本中有一个循环,它将运行10次。 每次执行后,我都希望将输出输出到浏览器“Element X finished.Y time.”。X和Y的值将发生变化 问题: 有没有办法达到这种效果?可能需要从这个脚本调用新脚本,新脚本将通过AJAX向浏览器发送数据 或者只有通过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);
}
for($i=0;$i在代码输出后调用
flush();
“元素X完成.Y时间。”


默认情况下,PHP会将所有输出存储在输出缓冲区中,直到它准备好发送到浏览器。
flush()
ob_flush()
强制发送输出。

尝试在每个循环中调用。第一个循环发送输出缓冲区,第二个将其删除。

是的,应该可以单独使用PHP实现。我记得不久前在wordpress中跟踪时看到一些与此相关的代码,当它更新模块时,它必须ftp、解压缩、复制文件等c、 这需要很长时间,而且它喜欢让用户随时了解它目前正在做的事情……在检查了他们的send_message()函数并阅读了PHP页面后,我想您需要:

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()可能会有所帮助,这样浏览器在开始时就知道了这一点,而不会等到整个二进制对象变为可用,然后再尝试对其拥有的实体进行解密

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

ajax解决方案的外观如下:


您的脚本会抛出一些html/javascript来满足ajax请求,刷新所有缓冲区,并停止与用户的关系,然后开始一些操作,或者可能只是指示某个大型操作将在某个数据库中开始,以便cron作业拾取。页面上的javascript将有一个计时器循环来轮询n ajax端点的状态,直到ajax回复完成为止。ajax端点将通过查询数据库或检查输出文件等方式检查任务的状态,并立即吐出所有知道的内容并终止,让客户端决定何时询问是否再次完成任务。这是一个更复杂的过程使用更多的运动部件,但为用户实现了一个非常好的最终产品,如果它值得您花时间制作的话。

为什么不使用打印而不是在循环结束时返回输出?打印?我不明白。假设我将输出回显到浏览器,与测试代码进行比较。@Xarvalus的可能重复您当时没有添加测试代码我发表了评论。我现在看到你在循环中回音。没有连接并返回
$output
。当然,你仍然需要使用
flush()
。效果很好。我还必须从代码中删除ob\u start()。另外,注意抛出“ob\u end\u flush():删除和刷新缓冲区失败。没有要删除或刷新的缓冲区”但它出现在当前情况下,以后不会成为问题。谢谢您的帮助。