PHP页面静态化技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何为大型网站提速:
1.静态化
2.缓存技术memcache
3.Mysql优化
瓶颈:带宽,数据库访问
提出问题->引出新技术->小案例->细节->使用到项目中
三个重要概念:
1.静态网站
http://localhost/test.html
2.动态网址
http://localhost/showNews.php?id=2&title=test搜索引擎不喜欢
3.伪静态网址
传统做法:
http://localhost/showNews.php?lang=cn&class=2&id=100
这种网址不好,SEO不好, SQL注入攻击危险
改成伪静态网址:不要过于精简
http://localhost/news-cn-class2-id100.html
补充说明:SEO 搜索引擎优化
页面静态化概念:
在实际开发中通常使用缓存技术或页面静态化来解决
页面静态化分为:
1.真静态:把php -> html访问时不操作数据库
2.伪静态:只是把网址静态(访问数据库)
页面静态化的必要性:
1.访问PHP的速度一般比html慢
ab.exe可以用来测试网站访问速度( 压力测试),该工具可以模拟多人并发访问某个页面ab.exe -n 10000 -c 10 http://localhost/test.php
-n:请求多少次
-c:表示多少人并发访问
2.利于搜索引擎优化
URL长度,静态页参数,meta信息,图片alt信息,frame信息(尽量不要使用框架) 3.防止SQL注入
缓存机制不用总访问数据库
使用php缓存机制完成页面静态化
如果要测试php自己的缓存机制,需要做配置
php.ini中:
display_errors=On
output_buffering=Off
error_reporting=设置错误级别
<?php
//开启缓存[可以通过php.ini, 也可以通过ob_start()]
ob_start();
echo "yyy";
header("content-type:text/html;charset=utf-8");
echo "hello";
//ob_clean() 可以清空output_buffering内容
ob_clean();
//ob_end_clean()关闭output_buffering缓存,同时清空其中内容ob_end_clean();
//ob_flush()函数是把output_buffering内容输出,清空
ob_flush();
//ob_end_flush()函数是把output_buffering内容输出,清空并关闭ob_end_flush();
echo "kkk"; // => 程序缓存(内容必须放在header()后面)
//ob_get_contents()可以获取output_buffering内容
//$contents=ob_get_contents();
//file_put_contents("d:/log.txt", $contents);
?>
flush()函数是刷新程序缓存的内容
补充:php header()函数
定义和用法
header() 函数向客户端发送原始的HTTP报头。
认识到一点很重要,即必须在任何实际的输出被发送之前调用header() 函数(在PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题)
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
<html>
<?php
/* This will give an error. Note the output
* above, which is before the header() call */
header('Location: /');
?>
程序开销
内存<文件<数据库
页面静态化思路:
如新闻这种信息,不是对实时性要求很高,并且比较稳定,所以我们可以这样做。
当第一个用户访问某个新闻时,我们用OB的缓存机制,把内容缓存到html页面中,
在下次访问时,直接访问html界面即可
在PHP中,以下代表假
1.FALSE
2..整型0
3.浮点型0.0
4.空字符串
5.不包含元素的数组
6.不包含任何成员变量的对象(仅PHP4.0适用)
7.特殊类型NULL
8.从没有任何标记的XML文档中生成的SimpleXML对象
第一次访问时,访问数据库,先用ob_get_contents()获取ob缓存数据,并通过file_put_contents()写入到一个html文件中(html命名有相应规则,按规则生成html文件名)
再次访问时,按命名规则生成文件名,判断文件是否存在,若存在,则直接使用文件
用echo file _get_contents()将html内容输出,若不存在,则再访问数据库
问题:如果静态页面更新了,则内容会永远不变
解决方法:
方法1:可以判断静态页面是否过期,比如设置为30秒,如果过期,则重新创建(不太好) 可以写成if(filetime(...)+30 > time()){访问静态页面}
问题:
1.访问时,点击查看的时候还是php页面(SEO不好) -->html网址
2.实时性不够好,有30秒的延时
解决方案(真静态和伪静态)
解决思想:
当我们添加新闻或者更新新闻时就同步更新html静态页面
通常做法是设计模板文件(网页设计师/美工),通过模板创建静态页面
注:mysql_insert_id()取得上一步insert自动产生的ID
http静态页(真静态的好处)有三点
1.减少服务器对数据库访问的负荷
2.加载页面不用访问数据库,响应速度快
3.便于SEO
缺点:
1.占用空间比较大
2.生成文件多了,服务器对html文件的响应负担也比较重
3.对硬件的耗损大
整体思路:
提出为什么需要静态化
静态化的方式
1.使用OB缓存来实现静态化
问题1:实时性不好,有延时
问题2:请求某个查询页面时使用php动态网站
2.真静态,在添加和修改时,可以实时的处理静态页面问题
问题:如果数据量是海量的,造成真静态的html页面过多
占用磁盘空间很大
-->使用伪静态技术弥补缺陷
业内最喜欢用伪静态+OB缓存
http://localhost/index.php/1,2,3.html服务器会找到index .php 而后面当成参数需求如下:因为SEO的原因,上面的网址本身应该写成
http://localhost/index.php?a=1&b=2&c=3
但是这种网址SEO不喜欢
通常公司会使用伪静态技术,把上面的网址写成
http://localhost/index.php/1,23,3.html
问题:如何动态取出1 23 3这三个值
有两种方法来处理:
1.在PHP文件中,直接使用正则表达式处理
$_SERVER['PA TH_INFO']; 可以取得/1,23,3.html
提出问题:
如何实现:http://localhost/news-sport-id56.html
相当于向http://localhost/mews.php?class=sport&id=56发请求
解决方案:rewrite机制
2.配置apache的rewrite机制
http://localhost/news-id56.html
如何使用rewrite:
1.配置apache启动mod_rewrite模块(httpd.conf)
2.配置虚拟主机
到hosts文件中添加ip和域名的对应关系
127.0.0.1
在httpd.conf中启动虚拟主机机制
3.配置httpd_vhosts.conf
4.在目录下添加.htaccess文件,这个文件是指定rewrite规则
注:IfModule rewrite_module 判断这个机制是否启用,若未启用则不用这段配置注:在< Directory>段的配置,默认值是在http.conf中配置的,父目录的选项
在httpd中也有<Directory>
5.这个rewrite规则也可以在虚拟主机里直接配置<Dierctory>段
可以有多个Directory,建议用htaccess进行配置
真静态和伪静态的区别:
=>伪静态是站在seo角度来看的,对应的页面不是真正存在的,而是每次查询数据库得到的信息
=>真静态的页面是真实存在的
伪静态缺点:每次访问时还要访问数据库,可以使用缓存技术来解决问题
即OB+伪静态
PHP中如何使用正则表达式:
//案例
$str ="aaaaa1234jfklajfl9000";
//需求如何将所有数字匹配出来
preg_match("/\d\d\d\d/si",$str,$arr);
注:正则表达式最好用单引号包上
在双引号中无法使用反向捕获
总结:
1.如果只是为了SEO,完全不希望有静态页面,那就只使用伪静态就可以了
2.如果网站要SEO,数据量海量,则OB+伪静态,访问多了,就成了真静态了,
能否定时清空一下老的html文件
思路:
1.在windows下,有一个任务管理器
2.在linux下,有一个crontab
它们可以定时执行某个程序
真静态VS伪静态
1.真静态访问效率高,利用SEO,可以减少对数据库的操作,但是会占用大量磁盘
2.伪静态方便实现搜索引擎优化,占用空间少,通过生成不同的view-id2.html可以实现内容的变化,可以有效防止注入攻击
结论:如果一个网站频繁被访问,比如百万级别,通过该网页每次操作数据库,可以考虑使用真静态,如果一个网页为了实现对搜索引擎的优化,提供网站的安全性,使用伪静态
真静态和伪静态的选择。