网页的访问速度是一个系统至关重要的生命线,如果访问速度慢那么网站会损失大量的客户或者访问人群。所以 PHP 静态技术在这里显得非常的重要。
今天我对 PHP 的静态技术进行了学习,PHP 静态技术的神秘面纱被我掀开了一角。
首先要了解几个知识点
第一 静态分为 纯静态和伪静态。纯静态里面又可以分为全静态和局部静态,其中局部静态主要是用 JavaScript 来编写的。一般使用 JQUERY 的 ajax 访问技术对局部静态进行显示。
第二 网址的重写也是非常重要的。
PHP 生成静态 主要使用一个函数
file_get_contents(path,include_path,context,start,max_length) 该函数主要用来写入和生成 HTML 文件
参数 | 描述 |
---|---|
path | 必需。规定要读取的文件,或者 url。 |
include_path | 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 ‘1’。 |
context | 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。 |
start | 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。 |
max_length | 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。 |
OB 函数: 用到最多的就是 ob_get_contents() ob_start()ob_get_clean() ob_clean() 其他不常用 可看 php 手册
ob,输出缓冲区,是 output buffering 的简称,而不是 output cache。ob 用对了,是能对速度有一定的帮助,但是盲目的加上 ob 函数,只会增加 CPU 额外的负担。
下面我说说 ob 的基本作用:
1)防止在浏览器有输出之后再使用 setcookie()、header()或 session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。
2)捕捉对一些不可获取的函数的输出,比如 phpinfo()会输出一大堆的 HTML,但是我们无法用一个变量例如 $info=phpinfo(); 来捕捉,这时候 ob 就管用了。
3)对输出的内容进行处理,例如进行 gzip 压缩,例如进行简繁转换,例如进行一些字符串替换。
4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成 HTML,或者整页缓存中使用。
对于刚才说的第三点中的 GZIP 压缩,可能是很多人想用,却没有真用上的,其实稍稍修改下代码,就可以实现页面的 gzip 压缩。
ob_start(ob_gzhandler);
内容
没错,加一个 ob_gzhandler 这个回调函数就可以了,不过这么做有些小问题,一是需要 zlib 支持,二是没有判断浏览器是否支持 gzip(现在好像都支持,iphone 浏览器好像都支持了)。
以前的做法是判断一下浏览器是否支持 gzip,然后用第三方的 gzip 函数来压缩 ob_get_contents() 的内容,最后 echo。
一、ob 系列函数中常用函数集锦
ob_start(); // 打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。ob_clean(); // 删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean(); // 删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean(); // 返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()
ob_flush(); // 发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush(); // 发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush(); // 返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于 ob_end_flush()并返回缓冲区内容。flush(); // 将 ob_flush 释放出来的内容,以及不在 PHP 缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。ob_get_contents(); // 返回缓冲区的内容,不输出。ob_get_length(); // 返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回 FALSE。ob_get_level(); //Return the nesting level of the output buffering mechanism.
ob_get_status(); //Get status of output buffers. ob_implicit_flush(); // 打开或关闭绝对刷新,默认为关闭,打开后 ob_implicit_flush(true),所谓绝对刷新,即当有输出语句 (e.g: echo) 被执行时,便把输出直接发送到浏览器,而不再需要调用 flush()或等到脚本结束时才输出。ob_gzhandler //ob_start 回调函数,用 gzip 压缩缓冲区的内容。ob_list_handlers //List all output handlers in use output_add_rewrite_var //Add URL rewriter values out
put_reset_rewrite_vars //Reset URL rewriter values 这些函数的行为受 php_ini 设置的影响:output_buffering // 该值为 ON 时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler // 该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush // 作用同 ob_implicit_flush,默认为 Off。
二、实例讲解
1、使 header() 函数前可以有 echo 代码
Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。
输出控制函数不对使用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。
ob_start(); // 打开缓冲区
echo "Hello\n"; // 输出
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 才会输出,所以并不会有任何文件头输出的错误!
2、保存 phpinfo() 函数的输出
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
3、静态模版技术
所谓静态模版技术就是通过某种方式,使得用户在 client 端得到的是由 PHP 产生的 html 页面。如果这个 html 页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用 PHP 以及相关的数据库,对于某些信息量比较大的网站,例如 sina、163、sohu。类似这种的技术带来的好处是非常巨大的。
ob_start(); // 打开缓冲区 php 页面的全部输出
$content = ob_get_contents(); // 取得 php 页面输出的全部内容
$fp = fopen("output00001.html", "w"); // 创建一个文件,并打开,准备写入
fwrite($fp, $content); // 把 php 页面的内容全部写入 output00001.html,然后…… fclose($fp);
三、输出缓存句柄 ob_gzhandler
PHP4.0.4 有一个新的输出缓存句柄 ob_gzhandler,它与前面的类相似,但用法不同。使用 ob_gzhandler 时要在 php.ini 中加入的内容如下:
output_handler = ob_gzhandler;
这行代码使得 PHP 激活输出缓存,并压缩它发送出去的所有内容。
如果由于某种原因你不想在 php.ini 中加上这行代码,你还可以通过 PHP 源文件所在目录的.htaccess 文件改变默认的服务器行为(不压缩),语法如下:
php_value output_handler ob_gzhandler
或者是从 PHP 代码调用,如下所示:
ob_start("ob_gzhandler");
采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator 对压缩图形的支持不佳,因此除非你能够保证所有用户都使用 IE 浏览器,否则你应该禁止压缩 JPEG 和 GIF 图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
注意事项:
1、一些 Web 服务器的 output_buffering 默认是 4069 字符 或者更大,即输出内容必须达到 4069 字符服务器才会 flush 刷新输出缓冲,为了确保 flush 有效,最好在 ob_flush()函数前有以下语句:
print str_repeat("", 4096); // 以确保到达 output_buffering 值
2、ob_* 系列函数是操作 PHP 本身的输出缓冲区,所以 ob_flush 只刷新 PHP 自身的缓冲区,而 flush 是刷新 apache 的缓冲区。所以,正确使用俩者的顺序是:先 ob_flush,然后 flush。ob_flush 是把数据从 PHP 的缓冲中释放出来,flush 是把缓冲内 / 外的数据全部发送到浏览器。
3、不要误认为用了 ob_start()后,脚本的 echo/print 等输出就永远不会显示在浏览器上了。因为PHP 脚本运行结束后,会自动刷新缓冲区并输出内容。
那么 PHP 生成的方式也有三种 一种是通过缓存时间来判断 这个通过 filemtime() 这个函数来判断 第二种方法 自然是手动生成,后台使用一个按钮或者链接 生成 第三种方法就环境生成 window 使用计划任务 linux 使用 crontab 添加计划任务。具体操作自己上网上搜索咯。
局部静态:
主要是 AXAJ 技术;
通过 json 方式是非常直接有效的数据传输请求方式。这个功能 get 相对简单 POST 使用我还没有想过。
尤其是获取到的数据在本地如何处理。我也很想知道。会不是是下一个学习方向。今天学习的时候 学会了一个数据库联动的典型语句。这可是我一直在寻找的东东。
hit 和 new 是两张表
自己研究喽
最后 URL 重写 需要下点功夫,因为正则确实需要下点时间才能解决。不太喜欢这个东东,但是又那么重要。