计划任务 复制代码 代码如下:
ignore_user_abort(); // 用户关闭浏览器程序依然执行 set_time_limit;
// 不限制程序运行时间 $interval = 3; // 程序循环间隔时间秒 $link =
mysql_connect(‘localhost’, ‘username’, ‘paswd’); mysql_select_db;
mysql_query; do { // 用户关闭浏览器停止 start echo str_repeat; //
php只在输出时才检查用户连接状态.
一些web服务器的output_buffering默认值是4096字符. 为确保flush()有效,
设置为4069. ob_flush; // 用户关闭浏览器停止 end $query = “INSERT INTO
`test`.`test_demo` VALUES (‘计划任务’, ‘” . date) . “‘)”;
mysql_query; // 采用写入数据库验证程序 sleep; } while ;
如果没有输出php是无法检测用户连接状态的。即使关闭浏览器程序依然会运行直到apache服务停止或重启。
复制代码 代码如下: // 用户关闭浏览器停止
start echo str_repeat; // php只在输出时才检查用户连接状态.
一些web服务器的output_buffering默认值是4096字符. 为确保flush()有效,
设置为4069. ob_flush; // 用户关闭浏览器停止 end

buffer是一个内存地址空间,linux系统默认大小一般为4096(4kb)。主要用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域。

在php所谓的输出缓冲,就是代码中的echo
或者其他输出命令在执行的时候是先写入到 php
buffer,在脚本执行完或者强制执行输出缓存的命令后,才会把数据输出到浏览器(其中php
buffer 就是php.ini中设置的output_buffering
,默认是on,表明无限制大小,可以换成数字来限制大小)。

通过buffer可以使进程之间的相互等待变少。

例子:

例如,当你打开一个文本编辑器,输入一个字符时,系统并不会立即写入磁盘。而是存储在buffer中,当写满一个buffer时,才会把buffer的内容写入磁盘。

echo ‘www.111cn.net’;
echo ‘技术’;
echo ‘分享’;

当然也可以使用flush强制将buffer的数据写入磁盘。

这两个echo
是按顺序插入到缓冲区的,只有脚本执行完成或者强制执行缓存输出才会把数据输出到浏览器。
如果我想要实时地输出echo的数据,见下面的代码:

在php中,例如
echo,print,输出并不会立即通过tcp传递给浏览器输出。而是将数据写入php
buffer。当一个php buffer写满,才会通过tcp传递给浏览器。

ob_end_flush();
//关闭php缓存,或者在flush()前先执行ob_flush(),下面有解释
echo str_pad(” “, 256); 
for ($i=5; $i>0; $i–) { 
   echo $i. ‘<br>’; 
   flush(); 
   sleep(1);  
}

echo /print -> php output_buffer -> tcp buffer -> browser

注意:

php output_buffering

1:flush和ob_flush 区别:

默认情况下,php
buffer是开启的,默认值是4096(4kb)。可以在php.ini中找到output_buffering
配置。知道buffer写满,才会发送到浏览器。

乍看之下两者很像,而且很多手册的解释也不清楚,模凌两可,其实两者是有很大区别的。

也可以设置ob_start(),这样即使超过默认值(4kb)也不会立即发送到浏览器,只到脚本运行完成,或者调用了ob_end_flush方法,才会输出到浏览器。

当php.ini没有开启php
buffer缓存时,php脚本输出的内容都会在服务端处于等待输出状态
,不会保存到输出缓存,因为缓存都没开,此时利用flush可以将那些等待输出的内容立即输出来发到客户端(浏览器或者其他输出端)。

1.output_buffering=4096,输出较少的数据(少于一个buffer)
<?php
for($i=0; $i<10; $i++){
echo $i.’
‘;
sleep(2);
}
?>

当php.ini开启了php
buffer缓存后,php脚本输出内容的第一步是存储在输出缓存中
,此时等到输出的内容是没有数据的,用flush的话是无效果,取不到数据的。因此要先利用ob_flush把输出缓存中的内容取出来变成等待输出的状态,接下来在利用flush把内容发到客户端。执行的顺序是先ob_flush
再 flush。

运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。

因此要实现实时地输出,要么利用ob_end_flush 先关掉php
输出缓存后直接flush,要么先 ob_flush再flush。

2.output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改php.ini的output_buffering=0
<?php
for($i=0; $i<10; $i++){
echo $i.str_repeat(” “,500).’
‘; //
当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
flush();
sleep(1);
}
?>

2:浏览器无法输出实时数据

运行结果:因为禁用了php
buffering,不需要等到脚本运行完毕就可以输出,数据没有在php
buffer停留,可以看到断断续续间歇性输出。echo -> tcp buffer
->browser

把代码改成下面的代码,在chrome
firefox
ie等浏览器都是一次性输出的,很奇葩的现象:

3.当output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start()
<?php
for($i=0; $i<10; $i++){
echo file_get_contents(‘f.txt’).$i.’
‘;
sleep(1);
}
?>

ob_end_flush(); //关闭php缓存,或者在flush前ob_flush();
echo str_pad(” “, 256); 
for ($i=5; $i>0; $i–) { 
   echo $i; 
   flush(); 
   sleep(1);  
}

运行结果:f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。

找了半天的bug,终于发现了个现象,只要顺便加个html标签,即可实时输出。
原因是:只有在遇到html标签的时候才会即时输出,真是神奇,还好一般输出的内容都会带着html标签,很少纯文本。
解决办法:加个回车或者其他的html标签即可解决问题。

4.当output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start()
<?php
ob_start();
for($i=0; $i<10; $i++){
echo file_get_contents(‘f.txt’).$i.’
‘;
sleep(1);
}
?>
运行结果:因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。

一:下面详细介绍out control 的相关函数

output_buffering 方法

1、flush //将等待输出的内容发送带浏览器,不会对缓存区有影响。

1.ob_start
激活output_buffering机制,一旦激活,脚本不再直接输出到浏览器,而是暂时写入php
buffering区域。直到脚本运行完毕后,才发送。

2、ob_flush // 将缓存区的内容变成等待输出状态,数据还没有输出到客户端。

2.ob_get_contents
获取php
buffering中的数据,注意:要在ob_end_clean()前调用,否则只会得到空字符。

3、ob_start(callback) //
打开输出缓冲区,可以加入回调的callback函数,实现在输出之前执行想要的功能。

3.ob_end_flush 和 ob_end_clean
ob_end_flush 会输出php buffering 中的数据,但不会清空。
ob_end_clean 不会输出,只会清空php buffering中的数据。

例子(1)

所以, ob_flush是刷新PHP自身的缓冲区.

ob_start(‘callbackFun’);
echo ‘1111111’;

发表评论

电子邮件地址不会被公开。 必填项已用*标注