PHP中刷新输出缓冲
来源:互联网 发布:华为 抢购软件 编辑:程序博客网 时间:2024/05/21 14:52
flush无效,IIS7下php怎么实时输出?
在一个比较费时的操作中,想把操作记录在浏览器上实时显示出来,用到了flush(),把缓冲中的内容发送到浏览器。但在iis7里面用fastcgi模式配置的php怎么都实现不了,结果总是一起显示出来。
for
(
$i
=10;
$i
>0;
$i
--)
{
echo
$i
.
'
'
;
@ob_flush();
flush
();
sleep(1);
}
上面的代码在IIS的默认设置下是无法逐渐显示结果的。解决办法如下:
打开文件 C:\Windows\System32\inetsrv\config\applicationHost.config ,注意如果你的是64位系统,这个文件就必须用64位的编辑软件打开,32位的软件打开会提示文件不存在,就用系统自带的notepad记事本打开就可以了。找到下面这一段,加入红色的那段代码就行了,也就是php这个handler里面加上responseBufferLimit="0"。
responseBufferLimit="0"
/>
现在你可以试一下,如果还是不行的话把php.ini里面的output_buffering = Off。
最后一点很重要,在不同的浏览器中,也用有不一样的结果。IE里面应该没什么问题了,如果是用chrome的话,每个echo出来的内容必须带有html,不然也是不行的,还有如果echo的内容太短也是实现不了这个效果的,可以在代码前先输出一段空格,如:echo str_pad(' ', 1050); firfox,chrome好像要先输出1000多个字符才会有这个效果,不行的话自己多尝试。
PHP中刷新输出缓冲
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
在PHP中与刷新缓冲相关的函数有三个:
1). flush
刷新PHP程序的缓冲,而不论PHP执行在何种情况下。该函数将当前为止程序的所有输出发送到用户的浏览器。 但是该函数不会对服务器或客户端浏览器的缓存模式产生任何影响,也不会对PHP本身的缓存产生任何影响。
2).ob_flush
该函数对PHP本身的的缓存进行输出。PHP本身的缓存受php.ini中的output_buffering的控制。ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。
3).ob_implicit_flush
这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
以下是举例:
- <?php
- ob_end_clean();
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br/>'; -
flush(); -
sleep(1); - }
- ?>
- <?php
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br />' ; -
ob_flush(); -
flush(); -
sleep(1); - }
- ?>
- <?php
- ob_implicit_flush(true);
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br />' ; -
ob_flush(); -
sleep(1); - }
- ?>
另外我们还需要注意刷新缓冲不光受以上几方面的影响,还受以下影响:
1). 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函 数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
2). PHP安装模式的影响。以上方式对于PHP以Apache模块方式安装的情况,可以直接使用。
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 4k
gzip off;
PHP函数说明:
2.相关flush类似函数如下
- flush
- ob_ clean
- ob_ end_ clean
- ob_ end_ flush
- ob_ flush
- ob_ get_ clean
- ob_ get_ contents
- ob_ get_ flush
- ob_ get_ length
- ob_ get_ level
- ob_ get_ status
- ob_ gzhandler
- ob_ implicit_ flush
- ob_ list_ handlers
- ob_ start
- output_ add_ rewrite_ var
- output_ reset_ rewrite_ va
- PHP中刷新输出缓冲
- PHP中刷新输出缓冲
- PHP中刷新输出缓冲
- PHP中刷新输出缓冲
- PHP中刷新输出缓冲详解
- PHP中刷新输出缓冲详解
- PHP中刷新输出缓冲详解
- PHP刷新输出缓冲
- PHP flush刷新输出缓冲
- php输出缓冲问题!
- php缓冲输出flush
- 72 PHP 输出缓冲
- php输出缓冲机制
- PHP 缓冲输出
- PHP输出缓冲控制
- PHP输出缓冲(二)-- 缓冲配置
- 剖析PHP中的输出缓冲
- 剖析PHP中的输出缓冲
- jQuery验证控件jquery.validate.js使用说明+中文API
- 黑马程序员——Java基础1 开篇
- 安卓获取软硬件信息并上传给服务器(Socket实现)
- UVa 11988 Broken Keyboard(链表的应用)
- RobHess sift源码配置
- PHP中刷新输出缓冲
- win7 64位系统下安装MySQLdb
- POJ 1005 I Think I Need a Houseboat
- 在线快速将pdf转换成word
- C# 日期格式
- 孪生素数问题--暴露弱点,怎么重用,让相邻两个相减
- powershell 将文本转换成表格的另一种方式
- android 使用电脑上的虚拟机安装apk(图文教程)
- Longest Palindromic Substring [LeetCode] 最长回文子串