php使用ob_flush不能每隔一秒输出原理分析
本文实例讲述了php使用ob_flush不能每隔一秒输出原理。分享给大家供大家参考。具体分析如下:
实现功能:
浏览器每隔一秒输出一个数字。
php.ini配置为:
版本5.3
implicit_flush = off
output_buffering = off
另:查看output_buffering是否打开,可以:
var_dump(ini_get('output_buffering'));
好我们再来看看这段代码:
<?php $i = 3; ob_start(); while ($i--) { echo $i, "<br />"; ob_flush(); flush(); sleep(1); } ob_end_clean(); ?>
可为什么:这段代码不能每隔一秒输出呢??
原因分析:
apache运行原理:当你访问一个地址(发送请求)后,apache启动PHP,那么php执行是页面级的,即如果有可执行的代码:它全部执行完后再丢给apache,apache再丢给browser显示结果
如何实现?
如果是cli 显示结果方式又不一样,那里不一样呢?
linux cmd:
php5 test.php
由php直接执行,不经过apache,web service,就可以实现:
<?php $i = 3; while ($i--) { echo $i, "\n"; sleep(1); } ob_end_clean(); ?>
希望本文所述对大家的php程序设计有所帮助。
相关推荐
-
PHP flush 函数使用注意事项
ob_*系列函数, 是操作PHP本身的输出缓冲区. 所以, ob_flush是刷新PHP自身的缓冲区. 而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区. 在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲
-
简单谈谈php中ob_flush和flush的区别
ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情.. ob_*系列函数, 是操作PHP本身的输出缓冲区. 所以, ob_flush是刷新PHP自身的缓冲区. 而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.
-
php ob_flush,flush在ie中缓冲无效的解决方法
PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等).该函数将当前为止程序的所有输出发送到用户的浏览器. flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响.因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲. 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止 自己写了个小例子,想在页面每隔一秒输出一个数字. 按照网上的代码: 复制代码 代码如下: ob_e
-
php中flush()、ob_flush()、ob_end_flush()的区别介绍
flush().ob_flush().ob_end_flush()三者的区别: 首先,说下buffer,它是一个内存地址空间,为4096(1kb)[在php.ini配置文件中找到output_buffering配 置],php有php output_buffering机制,php代码在执行的时候,并不是立即将内容输出,而是想将echo/print内容输出到buffer,buffer满的时候才会将数据交给系统内核交由tcp传给浏览器显示,当开启php php output_buffering机制(
-
PHP逐行输出(ob_flush与flush的组合)
ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情.. ob_*系列函数, 是操作PHP本身的输出缓冲区. 所以, ob_flush是刷新PHP自身的缓冲区. 而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.
-
Nginx环境下PHP flush失效的解决方法
问题 我在一次调试PHP逐行输出时候,发现ob_flush和flush两个都失效了,通过phpinfo基本能判断php.ini的设置是正常的. 解决方法 再去看Nginx,发现Nginx中,有如下的设置: fastcgi_buffer_size 128k; fastcgi_buffers 8 128k; 问题基本找到了,Nginx会缓冲PHP输出的信息,当达到128k时才会将缓冲区的数据发送给客户端,那么我们首先需要将这个缓冲区调小,比如: fastcgi_buffer_size 4k; fas
-
php flush类输出缓冲剖析
<?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?> 按照php手册里的说法 该函数将当前为止程序的所有输出发送到用户的浏览器. 上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来. 好,我们来改一下这段代码,改成 <?php ob_end_clean();//修改部分 for ($i=10; $i>0; $i--) { echo $i;
-
PHP flush()与ob_flush()的区别详解
buffer ---- flush() buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域.通过buffer,可以使进程这间的相互等待变少.这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flu
-
php flush无效,IIS7下php实时输出的方法
在一个比较费时的操作中,想把操作记录在浏览器上实时显示出来,用到了flush(),把缓冲中的内容发送到浏览器.但在iis7里面用fastcgi模式配置的php怎么都实现不了,结果总是一起显示出来. for ($i=10; $i>0; $i--) { echo $i.'<br />'; @ob_flush(); flush(); sleep(1); } 上面的代码在IIS的默认设置下是无法逐渐显示结果的.解决办法如下: 打开文件 C:\Windows\System32\inetsrv\co
-
php中ob_flush函数和flush函数用法分析
本文实例分析了php中ob_flush函数和flush函数用法.分享给大家供大家参考.具体如下: ob_flush()函数: 取出PHP buffering中的数据,放入server buffering flush()函数: 取出Server buffering的数据,放入browser buffering 例如代码: <?php echo str_repeat('m0sh1' ,1000); for($i=0;$i<4;$i++) { echo $i.'<br />'; ob_f
随机推荐
- JavaScript实现数组降维详解
- SQL Server 2008 备份数据库、还原数据库的方法
- mongoDB 实现主从读写分离实现的实例代码
- php+jquery+html实现点击不刷新加载更多的实例代码
- jQuery mobile类库使用时加载导航历史的方法简介
- 学习Angular中作用域需要注意的坑
- 在ASP.NET 2.0中操作数据之十六:概述插入、更新和删除数据
- 简单的ASP统计制作实例
- 微信小程序 加载 app-service.js 错误解决方法
- Android使用开源框架ANDROID-IMAGE-INDICATOR实现图片轮播部署
- MySql版本问题sql_mode=only_full_group_by的完美解决方案
- 防止mysql重复插入记录的方法
- JS实现的5级联动Select下拉选择框实例
- 微信小程序对接七牛云存储的方法
- Javascript实现页面跳转的几种方式分享
- 10个易被忽视但应掌握的Python基本用法
- 关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
- Lua读写文件代码示例
- 优化SQL Server的内存占用之执行缓存
- 基于PHP编程注意事项的小结