仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1632|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之用PHP掌握您的阅读器cache

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大家如果能懂得“熟能生巧”的道理也就明白了这并不是浪费时间,同时这也可以减轻板主的负担,让他们有时间去处理更难的问题。cache|掌握|阅读器   Output Control 函数可让你自在掌握剧本中数据的输入。它十分地有效,出格是关于:当你想在数据已输入后,再输入文件头的情形。输入掌握函数不合错误利用 header() 或 setcookie(), 发送的文件头信息发生影响,只对那些相似于 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、 相干函数简介:
1、Flush:刷新缓冲区的内容,输入。
函数格局:flush()
申明:这个函数常常利用,效力很高。
2、ob_start :翻开输入缓冲区
函数格局:void ob_start(void)
申明:当缓冲区激活时,一切来自PHP法式的非文件头信息均不会发送,而是保留在外部缓冲区。为了输入缓冲区的内容,可使用ob_end_flush()或flush()输入缓冲区的内容。
3 、ob_get_contents :前往外部缓冲区的内容。
利用办法:string ob_get_contents(void)
申明:这个函数会前往以后缓冲区中的内容,假如输入缓冲区没有激活,则前往 FALSE 。
4、ob_get_length:前往外部缓冲区的长度。
利用办法:int 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 ([int flag])
申明:利用过Perl的人都晓得$|=x的意义,这个字符串可以翻开/封闭缓冲区,而ob_implicit_flush函数也和谁人一样,默许为封闭缓冲区,翻开相对输入后,每一个剧本输入都直接发送到阅读器,不再需求挪用 flush()


2、深切懂得:

1. 关于Flush函数:
这个函数在PHP3中就呈现了,是一个效力很高的函数,他有一个十分有效的功效就是刷新browser的cache.咱们举一个运转后果十分分明的例子来讲明flush.
Example 2.
<?php
for($i = 1; $i <= 300; $i++ ) print(“ “);
// 这一句话十分关头,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翻开browser的cache,如许可以包管cache的内容在你挪用flush(),ob_end_flush()(或法式履行终了)之前不会被输入。
<2>.如今的你应当晓得你所具有的优势:可以在任何输入内容前面利用header,setcookie和session,这是ob_start一个很大的特色;也能够利用ob_start的参数,在cache被写入后,然后主动运转号令,好比ob_start("ob_gzhandler");而咱们最经常使用的做法是用ob_get_contents()失掉cache中的内容,然后再停止处置……
<3>.当处置终了后,咱们可使用各类办法输入,flush(),ob_end_flush(),和比及法式履行终了后的主动输入。固然,假如你用的是ob_get_contents(),那末就要你本人掌握输入体例了。

来,让咱们看看能用ob系列函数做些甚么……

1、 静态模版手艺

简介:所谓静态模版手艺就是经由过程某种体例,使得用户在client端失掉的是由PHP发生的html页面。假如这个html页面不会再被更新,那末当别的的用户再次阅读此页面时,法式将不会再挪用PHP和相干的数据库,关于某些信息量对照大的网站,例如sina,163,sohu。相似这类的手艺带来的优点长短常伟大的。

我所晓得的完成静态输入的有两种举措:
<1>.经由过程y10k修正的phplib的一个叫template.inc.php类完成。
<2>.利用ob系列函数完成。
关于第一种办法,由于不是这篇文章所要研讨的成绩,所以不再赘述。
咱们如今来看一看第二种办法的详细完成:
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();
}else {
echo “毛病!没有输入”;
exit();
}
return $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 on the fly
** code by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since 1998/1999 have
** been equipped to support the HTTP 1.1
** standard known as "content-encoding."
** Essentially the browser indicates to the
** server that it can accept "content encoding"
** and if the server is capable it will then
** compress the data and transmit it. The
** browser decompresses it and then renders
** the page.
**
** Modified by John Lim (jlim@natsoft.com.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first '<?' tag.
** ------------Start of file----------
** |<?
** | include('gzdoc.php');
** |? >
** |<HTML>
** |... the page ...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";
if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
return 0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print "n<!-- Use compress $ENCODING -->n";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = "<p>Not compress length: ".strlen($Contents);
$s .= "
Compressed length: ".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header("Content-Encoding: $ENCODING");
print "x1fx8bx08x00x00x00x00x00";
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack('V',$Crc);
print pack('V',$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
这是catoc的一段很早之前的代码,是在weblogs.com看到的,他使用了zlib的函数,对传输的内容停止了紧缩,测试标明,关于10k以上的页面,会发生后果,并且页面越大,后果越分明……
  会PHP吗?会,我会把一加一的运算写在函数里,然后调用啦!
只想知道 该用户已被删除
沙发
发表于 2015-2-4 12:30:20 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
若天明 该用户已被删除
板凳
发表于 2015-2-5 03:15:50 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
不帅 该用户已被删除
地板
发表于 2015-2-7 08:27:38 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
若相依 该用户已被删除
5#
发表于 2015-2-9 22:20:39 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
乐观 该用户已被删除
6#
发表于 2015-2-28 00:46:17 | 只看该作者
当然这种网站的会员费就几十块钱。
因胸联盟 该用户已被删除
7#
发表于 2015-3-1 03:35:24 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
精灵巫婆 该用户已被删除
8#
发表于 2015-3-2 02:52:37 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
再见西城 该用户已被删除
9#
发表于 2015-3-17 18:10:40 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
10#
发表于 2015-3-24 18:15:53 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
愤怒的大鸟 该用户已被删除
11#
发表于 2015-3-28 07:48:15 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
莫相离 该用户已被删除
12#
发表于 2015-3-31 05:50:16 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
柔情似水 该用户已被删除
13#
发表于 2015-4-10 08:16:23 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
灵魂腐蚀 该用户已被删除
14#
发表于 2015-4-24 14:17:27 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
飘灵儿 该用户已被删除
15#
发表于 2015-4-27 12:01:21 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
变相怪杰 该用户已被删除
16#
发表于 2015-5-8 21:03:25 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
小魔女 该用户已被删除
17#
发表于 2015-5-10 05:48:48 | 只看该作者
当然这种网站的会员费就几十块钱。
分手快乐 该用户已被删除
18#
发表于 2015-5-12 13:57:38 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
深爱那片海 该用户已被删除
19#
发表于 2015-6-6 06:05:05 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
金色的骷髅 该用户已被删除
20#
发表于 2015-6-19 06:43:15 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 20:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表