相关文章推荐
酒量大的饭卡  ·  Configuring a SOCKS ...·  昨天    · 
想发财的遥控器  ·  4月10日全国铁路实施新运行图 ...·  1 周前    · 
旅途中的拐杖  ·  千人戈壁徒步遭参与者报警中断:整队只配1个医 ...·  1 年前    · 
无邪的木瓜  ·  团战大师-水龙敬!_哔哩哔哩_bilibili·  1 年前    · 
直爽的牛肉面  ·  模块数据特性概述 (Sun ...·  1 年前    · 
Code  ›  PHP实现即时将结果输出到浏览器开发者社区
软件 php safari
https://cloud.tencent.com/developer/article/1181635
神勇威武的领结
1 年前
作者头像
后端技术探索
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 后端技术探索 > PHP实现即时将结果输出到浏览器

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

作者头像
后端技术探索
发布 于 2018-08-09 15:54:35
927 0
发布 于 2018-08-09 15:54:35
举报

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++){
 
推荐文章
酒量大的饭卡  ·  Configuring a SOCKS proxy server in Chrome
昨天
想发财的遥控器  ·  4月10日全国铁路实施新运行图 首开兰州至成都动车 全程6小时50分钟- 四川省人民政府网站
1 周前
旅途中的拐杖  ·  千人戈壁徒步遭参与者报警中断:整队只配1个医生_新闻频道_央视网(cctv.com)
1 年前
无邪的木瓜  ·  团战大师-水龙敬!_哔哩哔哩_bilibili
1 年前
直爽的牛肉面  ·  模块数据特性概述 (Sun Management Center 3.5 用户指南)
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号