专栏首页后端技术探索PHP实现即时将结果输出到浏览器

PHP实现即时将结果输出到浏览器

web开发中有没有碰到需要适时的将结果输出到浏览器页面而不刷新整个页面的需求呢?当你在处理一个过程需要耗时很长,但你又需要适时的知道程序当前的处理状况的时候,该怎么办呢?下面就分享一下如何使用php及时的输出当前结果到浏览器而不刷新整个页面的效果吧。

下面以一个简单的例子来说明这个问题。首先来看一段代码:

<?php
for($i=0;$i<10;$i++){
    echo $i;
    sleep(1);
}
?>

面这段程序如果在PHP解释器中执行,每秒会输出一个数,和预计效果一样。但在浏览器中访问时,结果却是浏览器在十秒之后一次性地显示了所有结果。对于这个问题,我们可以使用 ob_flush() 和 flush() 来强制刷新浏览器缓存,程序改为:

<?php
//author www.phpernote.com
for($i=0;$i<10;$i++){
    echo $i;
    ob_flush();
    flush();
    sleep(1);
}
?>

问题解决,但又出来个问题,浏览器还不兼容了。实际测试中只有 Firefox 按预计效果即时输出了结果,而在 IE Safari Opera 等浏览器中还是一次性的输出结果。查阅相关资料发现是因为不同的浏览器对缓冲的处理方式不同,Firefox 在被要求强制刷新缓存时很听话,而IE需要在接收到256个字节后才会将内容即时展现在界面上,Safari 需要1024个字节,Opera 更有个性,只有在遇到HTML标签的时候才会即时输出(Safari也是如此)。

对于以上问题,针对IE和Safari,可以在输出结果之前先输出大于限定数目的空白字符:

<?php
echo str_repeat(" ",1024);
for($i=0;$i<10;$i++){
    echo $i;
    ob_flush();
    flush();
    sleep(1);
}
?>

而对于Opera、Safari遇到HTML标签后才会即时输出的问题,由于一般我们不会只往浏览器中输出纯文本内容,故可以不作考虑。对于上面的程序,可以在输出结果中加入HTML标签来达到目的:

<?php
echo str_repeat(" ",1024);
for($i=0;$i<10;$i++){
    echo $i."<br>";
    ob_flush();
    flush();
    sleep(1);
}
?>

至此已基本实现了在各个浏览器中达到一致的效果了,至于实际工作中,你可能是另外一种目的但是需要类似这种效果,则只需要根据需要做相应的修改即可。

本文分享自微信公众号 - nginx(nginx-study)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-12-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP主动断开与浏览器的连接

    曾经整理过一篇《关于PHP连接处理中set_time_limit()、connection_status()和ignore_user_abort()深入解析》

    后端技术探索
  • 2分钟夜读学习:设置图片加载失败时的默认图片

    通过程序执行就行呗,程序有时候可能考虑不到这个问题,每次去判断图片是否存在也太麻烦了。最简单的就是通过图片配置实现。

    后端技术探索
  • 7个角度进行nginx性能优化

    在大多数情况下,一个常规安装的Nginx对网站来说已经能很好地工作了。然而如果想挤压出Nginx的性能,就需要了解哪些指令会影响Nginx性能,在本文中将解释N...

    后端技术探索
  • PHP中的echo即时输出

    web开发中有没有碰到需要适时的将结果输出到浏览器页面而不刷新整个页面的需求呢?当你在处理一个过程需要耗时很长,但你又需要适时的知道程序当前的处理状况的时候,该...

    C4rpeDime
  • 对图标的坐标轴进行调整

    坐标轴包含了标题,刻度线,刻度标签等多个元素,通过对各个元素进行个性化调整,可以使得图片更加美观。在matplotlib中,包含了一系列函数,可以对各种元素进行...

    生信修炼手册
  • vue简单实现九宫格抽奖

    wePanda
  • 使用BERT和TensorFlow构建多标签文本分类器

    在多标签分类问题中,训练集由实例组成,每个实例可以被分配有表示为一组目标标签的多个类别,并且任务是预测测试数据的标签集。例如:

    代码医生工作室
  • C++对象成员的引用 | 对象成员引用

    C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public成员...

    小林C语言
  • Redis 设计与实现: redisObject 数据结构,以及 Redis 的数据类型

    redisObject 是 Redis 类型系统的核心, 数据库中的每个键、值,以及 Redis 本身处理的参数, 都表示为这种数据类型。

    一个会写诗的程序员
  • python中怎么表示空值

    python中,万物皆对象,所有的操作都是针对对象的。 那什么是对象?5是一个int对象,‘oblong’是一个str对象,异常也是一个对象,抽象一点是,人,猫...

    砸漏

扫码关注云+社区

领取腾讯云代金券