远程控制客户端:PHP来控制客户端cache
来源: 发布时间:星期四, 2009年2月12日 浏览:55次 评论:0
Output Control 可以让你自由控制脚本中数据
输出
它非常地有用
特别是对于:当你想在数据已经输出后
再输出文件头
情况
输出控制
不对使用 header
或
cookie
, 发送
文件头信息产生影响,只对那些类似于 echo
和 PHP 代码
数据块有作用
我们先举个简单
例子
让大家对Output Control有
个大致
印象:
Example 1.
<?php
ob_start; //打开缓冲区
echo \"Hellon\"; //输出
header(“location:index.php”); //把浏览器重定向到index.php
ob_end_flush;//输出全部内容到浏览器
?>
所有对header有了解
人都知道
这个
会发送
段文件头给浏览器
但是如果在使用这个
的前已经有了任何输出(包括空输出
比如空格
回车和换行)就会提示出错
如果我们去掉第
行
ob_start
再执行此
我们会发现得到了
条
提示:“Header had all ready send by”!但是加上ob_start
就不会提示出错
原因是当打开了缓冲区
echo后面
不会输出到浏览器
而是保留在服务器
直到你使用flush或者ob_end_flush才会输出
所以并不会有任何文件头输出
!
、 相关
介绍:
1、Flush:刷新缓冲区内容
输出
格式:flush
介绍说明:这个经常使用
效率很高
2、ob_start :打开输出缓冲区
格式:void ob_start(void)
介绍说明:当缓冲区激活时所有来自PHP
非文件头信息均不会发送
而是保存在内部缓冲区
为了输出缓冲区
内容
可以使用ob_end_flush
或flush
输出缓冲区
内容
3 、ob_get_contents :返回内部缓冲区内容
使用思路方法: ob_get_contents(void)
介绍说明:这个会返回当前缓冲区中
内容
如果输出缓冲区没有激活
则返回 FALSE
4、ob_get_length:返回内部缓冲区长度
使用思路方法: ob_get_length(void)
介绍说明:这个会返回当前缓冲区中
长度;和ob_get_contents
样
如果输出缓冲区没有激活
则返回 FALSE
5、ob_end_flush :发送内部缓冲区内容到浏览器
并且关闭输出缓冲区
使用思路方法:void ob_end_flush(void)
介绍说明:这个发送输出缓冲区
内容(如果有
话)
6、ob_end_clean:删除内部缓冲区内容
并且关闭内部缓冲区
使用思路方法:void ob_end_clean(void)
介绍说明:这个不会输出内部缓冲区
内容而是把它删除!
7、ob_implicit_flush:打开或关闭绝对刷新
使用思路方法:void ob_implicit_flush ([ flag])
介绍说明:使用过Perl人都知道$|=x
意义
这个
串可以打开/关闭缓冲区
而ob_implicit_flush
也和那个
样
默认为关闭缓冲区
打开绝对输出后
每个脚本输出都直接发送到浏览器
不再需要
flush
2、深入了解:
1. 有关Flush:
这个在PHP3中就出现了
是
个效率很高
他有
个非常有用
功能就是刷新browser
cache.我们举
个运行效果非常明显
例子来介绍说明flush.
Example 2.
<?php
for($i = 1; $i <= 300; $i ) pr
(“ “);
// 这句话非常关键
cache
结构使得它
内容只有达到
定
大小才能从浏览器里输出
// 换言的如果cache
内容不达到
定
大小
它是不会在
执行完毕前输出
经
// 过测试我发现这个大小
底限是256个
长
这意味着cache以后接收
内容都会
// 源源不断被发送出去
For($j = 1; $j <= 20; $j) {
echo $j.”
”;
flush; //这
部会使cache新增
内容被挤出去
显示到浏览器上
sleep(1); //让“睡”
秒钟
会让你把效果看得更清楚
}
?>
具体效果你可以到这里看看http://www.php2000.com/~uchinaboy/out.php
PHP2000最新
PHP聊天室就是用
这个技术
可惜
是源代码未公开 L
注:如果在首部加入ob_implicit_flush
打开绝对刷新,就可以在
中不再使用flush
,这样做
好处是:提高效率!
2. 有关ob系列:
我想先引用我好朋友y10k
个例子:
Example 3.
比如你用得到服务器和客户端设置信息
但是这个信息会
客户端
区别而区别
如果想要保存phpinfo
输出如何办呢?在没有缓冲区控制的前
可以说
点办法也没有
但是有了缓冲区
控制
我们可以轻松
解决:
<?php
ob_start; //打开缓冲区
phpinfo; //使用phpinfo
$info=ob_get_contents; //得到缓冲区
内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
用以上思路方法
就可以把区别用户
phpinfo信息保存下来
这在以前恐怕没有办法办到!其实上面就是将
些“过程”转化为“
”
思路方法!
或许有人会问:“难道就这个样子吗?还有没有其他用途?”当然有了比如笔者论坛
PHP 语法加亮显示就和这个有关(PHP默认
语法加亮显示
会直接输出
不能保存结果
如果在每次
都显示恐怕会很浪费CPU
笔者
论坛就把语法加亮
显示
结果用控制缓冲区
思路方法保留了)
大家如果感兴趣
话可以来看看http://www.zphp.com/bbs/!
可能现在大家对ob_start功能有了
定
了解
上面
个例子看似简单
但实际上已经掌握了使用ob_start
要点
<1>.使用ob_start打开browsercache
这样可以保证cache
内容在你
flush
,ob_end_flush
(或
执行完毕)的前不会被输出
<2>.现在你应该知道你所拥有
优势:可以在任何输出内容后面使用header,
cookie以及session
这是ob_start
个很大
特点;也可以使用ob_start
参数
在cache被写入后
然后自动运行命令
比如ob_start(\"ob_gzhandler\");而我们最常用
做法是用ob_get_contents
得到cache中
内容
然后再进行处理……
<3>.当处理完毕后我们可以使用各种思路方法输出
flush
,ob_end_flush
,以及等到
执行完毕后
自动输出
当然
如果你用
是ob_get_contents
那么就要你自己控制输出方式了
来让我们看看能用ob系列
做些什么……
、 静态模版技术
介绍:所谓静态模版技术就是通过某种方式使得用户在client端得到
是由PHP产生
html页面
如果这个html页面不会再被更新
那么当另外
用户再次浏览此页面时
将不会再
PHP以及相关
数据库
对于某些信息量比较大
网站WebSite
例如sina,163,sohu
类似这种
技术带来
好处是非常巨大
我所知道实现静态输出
有两种办法:
<1>.通过y10k修改phplib
个叫template.inc.php类实现
<2>.使用ob系列实现
对于第种思路方法
不是这篇文章所要研究
问题
所以不再赘述
我们现在来看看第 2种思路方法
具体实现:
Example 4.
<?php
ob_start;//打开缓冲区
?>
php页面全部输出
<?
$content = ob_get_contents;//取得php页面输出
全部内容
$fp = fopen(“output00001.html”, “w”); //创建个文件
并打开
准备写入
fwrite($fp, $content); //把php页面内容全部写入output00001.html
然后……
fclose($fp);
?>
这样所谓
静态模版就很容易
被实现了……
2、 捕捉输出
以上Example 4.是
种最简单
情况
你还可以在写入前对$content进行操作……
你可以设法捕捉些关键字
然后去对它进行再处理
比如Example 3.所述
PHP语法高亮显示
个人认为
这个功能是此
最大
精华所在
它可以解决各种各样
问题
但需要你有足够
想象力……
Example 5.
<?
Function run_code($code) {
If($code) {
ob_start;
eval($code);
$contents = ob_get_contents;
ob_end_clean;
} {
echo “!没有输出”;
exit;
}
$contents;
}
以上这个例子用途不是很大
不过很典型$code
本身就是
个含有变量
输出页面
而这个例子用eval把$code中
变量替换
然后对输出结果再进行输出捕捉
再
次
进行处理……
Example 6. 加快传输
<?
/*
** Title.........: PHP4 HTTP Compression Speeds up the Web
** Version.......: 1.20
** Author........: catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content Acceleration compresses
** the data transmission data _disibledevent=> (strpos($HTTP_ACCEPT_ENCODING,\'gzip\') !
false)
\"gzip\";
0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip;
($ENCODING){
pr \"n<!-- Use compress $ENCODING -->n\";
$Contents = ob_get_contents;
ob_end_clean;
($debug){
$s = \"<p>Not compress length: \".strlen($Contents);
$s .= \"
Compressed length: \".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header(\"Content-Encoding: $ENCODING\");
pr \"x1fx8bx08x00x00x00x00x00\";
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
pr $Contents;
pr pack(\'V\',$Crc);
pr pack(\'V\',$Size);
exit;
}{
ob_end_flush;
exit;
}
}
?>
这是catoc段很早以前
代码
是在weblogs.com看到
他利用了zlib
对传输
内容进行了压缩
测试表明
对于10k以上
页面
会产生效果
而且页面越大
效果越明显…