资源描述
php页面静态化学习笔记
———————————————————————————————— 作者:
———————————————————————————————— 日期:
39
个人收集整理 勿做商业用途
题外话:大流量技术:
1.服务器集群2。mysql优化(设计合理的数据库表3nf,分表垂直分割水平分割,读写分离技术多个mysql同时工作,mysql配置优化,硬件升级)3。缓存技术memched/redis。。大型网站提速提速:Mysql优化,页面静态化,memcached大型网站的定义:
1. pv值(page views):页面的访问量。当页面访问量很大的时候,带来了很多问题:
① 流量变大,解决方案 买带宽,优化程序,图片的大小不能多于多少K
② 并发量变大,同时访问网站的人多了,解决方案,要对程序的结构进行修整->服务器集群
传统架构:
优化结构:
整个的重点还是php程序,考验程序员的东西.
2. 数据量很大:解决方法:
① 表的设计合理
② 分表技术(垂直分割和水平分割)、建立适当的索引、读写分离、Mysql配置优化(调整最大并发量,定时对数据库碎片整理、碎片,实现方法:windows下用任务管理器,niux下用crontab),硬件升级
③ 页面静态化
④ 缓存技术(memcached)
页面静态化技术
原理图:
几个概念:
静态网址:如果我们访问的是静态页面,则把这个url称作静态网站,html网址
特点:
1。利于seo(search engine optimization)搜索引擎优化
2.访问速度快
3。防止sql注入漏洞
动态网址:在访问的时候可以传入参数,称为动态网址,php网址
特点:
1. 不利于seo
2. 访问速度慢
3.sql注入的可能
伪静态网址:希望达到这样的目的,
这样的话,我们把图片下端的称为伪静态网址。这样做的特点:
1. 利于seo
2. 防止了注入
但是它仍然要访问数据库,也就是说速度没有优化。页面静态化的分类:从方式来看:1.真静态,2。伪静态从范围来看:1.全局静态,2。局部静态。
测试压力的工具ab.exe
需要进入控制台
ab.exe –n 访问的总次数 –c 多少人访问url(并发量)
举例说明
ab。exe –n 10000 –c 100 http://localhost/ phpstatic/ test.php
当我们调整访问人数为1000的时候:
很悲剧的事情发生了,说明我们的apache服务器支撑不住了。解决方案,我们需要调整apache的最大并发量.
MPM(多路处理模块,就是指明apache怎样处理并发):apache处理并发的方式。有三种方式
1. perfork 预处理进程方式:预先准备一些进程,等待请求的到来,这样的方式消耗很大。
2. worker 工作模式:预先开启进程,当有请求的时候,进程会开启线程,线程为请求服务。一个进程可以开启多个线程
3. winnt模式 windows下采用的:就是worker模式
简单的说是这样的:
如何设置apache最大并发数:
1.位置httpd。conf文件中,大约470多行.
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
2。确定apache的工作模式:
cmd下进入apache的bin目录,输入httpd.exe –l(小写的L) ;
我们主要看mpm_yyyyy ,如果这个yyyy是什么,就说明是什么工作模式了。
3。去修改httpd-mpm.conf
调整150为1000
刚才的测试可以运行了
4.重启apache
在linux下如何配置呢,
建议配置:
如果网站的pv值上到了百万:可以调节如下
每个都增加1000即可。
对比图:
搜索引擎的偏好:
如果一张图片希望被百度搜到,
〈img alt="小狗” src="”。.。... /〉
在网站的前台,我们建议不要使用frame这个框架
给一个图片或者视图取名字,标题越短越精准会越好.
页面静态化技术实现方式:
1.使用php自带的ob缓存
2.模板替换技术(正则表达式)
使用PHP自带的缓存机制实现页面静态化:
ob缓存机制:
〈?php
echo ”hello100”;
header("content—type:text/html;charset=rtf-8");
echo "hello200”;
?>
在php5.2这个版本,在php.ini有一个配置,output_bufferring,如下:
如果关闭,就会出现如下警告
ob缓存的原理:
打开ob缓存就可以解决
① 配置php。ini,output_buffering=4096(字节)
② 在程序中开启ob_start();开启ob缓存
注意:
如果ob缓存打开,那么echo就放在ob缓存里面,如果是header就放到程序缓存里面去。当页面读取完成,那么ob缓存的内容就会被刷新到程序缓存,一并发送给浏览器。
ob的几个重要函数:
ob_clean():清理ob缓存
ob_get_contents():读取ob缓存的数据
ob_end_clean():该函数是清空ob中的数据,并关闭ob缓存
ob_end_flush();//把ob缓存的数据刷新到程序缓存,同时关闭ob缓存
ob_flush();//把ob缓存的数据刷新到程序缓存
flush();//把程序缓存的数据,强制刷新到浏览器
如下面演示:
但是运行结果没有我们想象的那样1秒显示一个数字,我们查看flush()函数发现了问题:
如果一定要有效果我们可以:
使用ob缓存机制完成一个简单的新闻管理系统:
我们实现全站静态化。
先按传统方式写完了代码,发现本机访问速度都相当的慢。
我们开始做优化:当第一人访问我们的页面时,我们就查询一次数据库,并生成一个静态页面.其他人来查询的时候,我们直接就将生成的静态页面的直接返回.
1. 生成静态页面
2. 加上逻辑,即可实现一定的优化:
第一个页面:
〈?php
//列出新闻
//
header(”content—type:text/html;charset=utf-8");
$conn=mysql_connect(”localhost”,"root","root");
if(!$conn){
die ("连接失败"。mysql_error());
}
mysql_select_db(”newssystem",$conn);
mysql_query(”set names utf8");
$sql="select * from news”;
$res=mysql_query($sql);
echo ”<h1〉新闻列表〈/h1>";
echo ”〈a href='addNews.html’〉添加新闻〈/a〉<hr/>";
echo "〈table〉”;
echo "〈tr〉〈td>id</td><td>标题〈/td〉〈td>〈a href=’#’>查看详情</a></td〉〈td〉修改新闻</td></tr>”;
while($row=mysql_fetch_array($res)){
echo ’〈tr>〈td〉’.$row[0].'</td><td>'.$row[1].’</td>〈td〉<a href=”showNews。php?id=’。$row[0].’">产看详情〈/a〉〈/td〉〈td>〈a href="">修改新闻〈/a></td〉</tr>’;
}
mysql_free_result($res);
mysql_close($conn);
?>
第二个页面:
〈?php
//传统做法 接受id,查询数据库
$id=intval($_GET['id']);
//先判断该新闻对应的新闻的静态页面是否存在
$html_file="news—id"。$id。”。html”;
if(file_exists($html_file)){
echo "静态页面”;
echo file_get_contents($html_file);
exit;//这个exit特别重要,如果没有,静态化得效果就没了
}
$conn=mysql_connect("localhost”,"root","root");
if(!$conn){
die ("连接失败”。mysql_error());
}
mysql_select_db("newssystem",$conn);
mysql_query("set names utf8");
$sql=”select * from news where id=$id”;
$res=mysql_query($sql,$conn);
if($row=mysql_fetch_assoc($res)){
ob_start();//启动ob缓存
header(”content-type:text/html;charset=utf—8");
echo "<head〉<meta http-equiv=’content-type' content='text/html;charset=utf-8'/〉</head>";
//解决乱码
echo ”〈table border=’1px’ bordercolor=’green' cellspacing='0' width=’400px’ height=’200px’>”;
echo "〈tr〉〈td>新闻详细内容〈/td〉</tr>”;
echo "<tr>〈td>{$row[’title']}</td〉</tr>";
echo "〈tr〉<td〉{$row['content']}〈/td〉〈/tr〉";
echo "</table〉";
$ob_str=ob_get_contents();
//把$ob_str保存到一个静态页面
//取文件名是有很多规则的
file_put_contents("news—id”。$id。”.html”,$ob_str);
}
?>
以上代码的缺点:
静态页面的内容一旦生成,那么它永远也不会变了。当数据库的数据更新的时候,我们的网页访问内容也没变.
解决方案:1.定时更新。我们让30秒同步一下数据库和我们的静态页面.
代码修改如下:
时间函数:filemtime($html_file),获取上次文件被修改的unix时间.time()函数,获取当前时间函数.
上面的解决方案仍然会有时间延迟,随意我们采用第二套方案,这样做就没有时间延迟了
页面静态化的第二套技术:模板替换技术(正则表达式):
在添加新闻的时候就去生成静态页面:
原理图:
添加新闻的静态页面addNews.html
.。。.。。。.
代码如下:
newList。php:稍多修改,让其直接跳转到我们在添加过程中生成的静态页面
newAction。php:
news.tpl:模板文件
这里我们跳过了showNews这个页面,因为在以上的机制中,我们就不用那个页面了,这个页面在最后的我们可以用作主页面静态化
通用的cms系统示意图。
现在我们来考虑全站静态化:
我们可以在添加新闻后就能使首页发生直接静态化呢
我们将管理的文件都保存到manage下面,用户只能看到前台主页和生成的静态的新闻详情页面.
需求,我们如果的确需要只要首页面的内容有变化就立马更新。
我们只需要加一句话:
在newsAction.php下面加一句话:
自己理解的图解:
以上就是我们所说的真静态,我们来分析一下真静态的优缺点:
有点:1访问速度块(不需php这个模块解析,不需查找数据库)。2利于seo。3防止sql注入
缺点:因为它要真正的生成大量的html文件,要占用一定的磁盘空间,如果我们将所有的html文件都放在一个文件夹下,比如我们把1亿个html放在一个文件夹下,那么这个速度会很慢的。我们的做法是:按照年月日创建文件夹,按照文件夹管理一定的数量的,这样检索速度会快一些的。
safe_mode:apache的安全模式。就会不允许创建文件夹,徐和管理员沟通。
在一下情况不允许使用真静态:
1. 实时性要求很高的网站和页面(股票,基金)
2. 数据量大,同时查询一次后,以后就很少查询(国家学历认证网,电信话费查询系统),就是生成的静态页面以后不被访问,那么我们生成这个html文件也就没有意义了
3. 不愿意被seo到这个网页.
伪静态技术:
实际开发中有需求:不希望使用真静态,但是又希望seo,可以考虑使用伪静态。
成为:
实现方式有两种:1。直接使用正则表达式;2.使用apache自带的rewrite机制来完成。
正则表达式:
例子:
方案一:str分割
方案二:正则
详细讲解正则表达式:
演示:
运行结果:
正则表达式重要概念:
1。 值表达式:()括起来的
2. 捕获:抓取值表达式到内存中,暂存起来
3. 反向引用:\1,\n {x} 去引用捕获到得值表达式
//$reg:规则 $str:目标字符串 $res:结果集
preg_match($reg,$str,$res);
preg_match_all($reg,$str,$res);参数意思同上。
案例说明:
说明 。就不要带中括号了
转义字符:
正则表达式的用处:
1. 正则规范是根本性的东西,在任何一个语言中都是有使用的。如php,asp,js,jsp,。net,c++,c,java等等都在使用
2. 在涉及到用户输入的地方或者程序中,应当加入正则验证.
在网站建设中我们应该两头都验证:客户端使用js,服务器端使用php。
特殊的说明:
在正则规范中,我们可能会看到 (?: pattern)(?!pattern)(?<!pattern)(?=pattern)(?〈=pattern)
(?: pattern):非捕获匹配(一般的匹配都是捕获匹配)
(?!pattern):顺序否定环视,位置右侧不能再匹配pattern
(?=pattern):顺序肯定环视,位置右侧可以匹配pattern
(?<!pattern):逆序否定环视,位置的左侧不能匹配pattern
(?<=pattern):逆序肯定环视,位置左侧可以匹配pattern
例子:
针对我们上面提出的问题,我们给出的解决方案是:
正则规范的课堂练习:
联系:结巴程序。
在实际开发中,我们实现伪静态更多的是:rewrite机制,是 正则技术为基础的。
需求:
①http://
变成:②http://
rewrite机制的原理图:略
我们在用访问②的方式,可以访问到①.
httpd。conf文件可以开启rewrite模块
具体的做法:
(1).启用rewrite模块,修改httpd.conf文件
(2)配置虚拟主机
httpd.conf打开虚拟主机的配置文件
修改httpd—vhosts。conf文件
(3) 配置hosts文件
我们可以用www。zh。com来访问了
一个重点:在apache服务器中,如果某个文件夹没有指定访问的权限,则它的访问权限由上级目录的权限决定。如果指定了则按自己的访问权限来.
问题:如果只允许我自己访问:可以在httpd.conf中修改,也可以在httpd—vhosts。conf中修改,
在配置访问权限的时候顺序很重要.
在实际中如果要放行某一段
可以写出allow from 196.0。81即可
(4)。<Directory>节点:
第一种配置方式:
比较完整的配置:
可能遇到的问题:
如果apache启动不起来,一定要留意rewrite模块是否启动。
关于文件夹下的文件夹的规范:可以配置多个节点:
有时候你不能动httpd—vhost文件,但是还要实现功能.
我们可以把配置写到htaccess文件中。
第二种配置方式:在网站目录下的.htaccess(另存为可创建)
网站主目录文件夹下的子文件夹也可以创建并配置这个.htaccess文件。说明这个文件的配置也是继承关系
第三种配置方法:
httpd-vhosts.conf里面就留下一句话,其他的都交给.htaccess去控制.
在我们的。htaccess文件中:
至此我们三种配置方式就OK了。
伪静态的实际应用:
1. 图片防盗链:我们有一个情景:在一个项目中有两个图片文件夹public和private,public可以被所有人访问,private只能自己访问。
方案一:在public和private下面创建.htaccess,对于public文件夹allow from all,zai private文件夹
order deny,allow
deny from all
allow from 127。0.0。1
这样就ok了。
分析这个方案:如果一个apache下有多个虚拟主机,那么就有问题了,你只设置了一个虚拟主机的权限,而另一个虚拟主机的地址也是127.0.0.1,所以它也可以访问到private文件夹。缺点就是无法精确控制.
方案二:正则规范
在private下面加上:
〈ifmodule rewrite_module>
rewriteEngine On
#你怎么知道请求是www.zhanghui。com发过来的,相当于:if
RewriteCond %{HTTP_REFERER}!
#如果你请求的是一个jpg图片,就forbidden,F表示直接禁用,相当于执行语句
RewriteRule 。*\.jpg -[F]
#这里可以封杀多个后缀,多种文件。js,css,gif都可以这样整。
☆ RewriteCond %(HTTP_REFERER)!www。zhanghui。com
RewriteCond %(REQUEST_FILENAME)!—f
#以上两个条件是并且的关系
RewriteRule 。.。。.。
这个是完整的图片防盗链技术。但是这个有一定的缺陷,如果我们模拟一个http头,将referer写成,那么这张图片也可以被取下来。
特别说明:在我们自己的目录下最好不要配置Options这个东西,因为在父目录中已经配置过了。如果你配置了,而和父目录的不一样,那就惨了,你所有的网页、重定向的东西都会出现403错误,很惨的.
我们来做让apache管理两个虚拟主机
www。zhanghui。com
写好了代码,我们现在去访问private文件夹下的index网页:结果如下:
我们发现目前这两个虚拟主机private和zhanghui都可以访问到,但是有时候,我们希望只有自己(private)的主机访问到自己,我们可以这样做了,修改private下的。htaccess文件
简化url:
①
②www。zhanghui。com/index.php?c=haha&a=login
用户在访问①的时候就相当于访问了②
index。php文件的内容:
我们可以这样来写规则:
运行效果如下:
rewriteCond指令:
RewriteRule aaa。html bbb。php
如果aaa。html存在,则访问aaa.html,如果不存在则访问bbb。php。
伪静态实际应用:
在TP框架中简化url,目的是seo
① 在httpd。conf文件中打开rewrite模块
② 在虚拟主机中增加allowoverride all
③ 在TP的配置文件conf/config文件中把URL_MODEL配置为2.
④ 在TP框架的入口处写入规则。。htaccess文件.
伪静态与真静态最后的对比:
伪静态的特点:
访问一次,引擎优化,占用空间小,很多的静态页面可以访问同一动态页面,广告的轮显,缺点速度慢。
真静态伪静态非静态之间的选择:
1. 网站实时性要求高,不要使用真静态化。
2. 如果网站访问量比较小,没必要使用静态化技术.
3. 如果网页的数据不是经常变化,而访问频率极大,建议使用真静态。公司营销等宣传性网站.
4. 数据海量,使用真静态会生成海量的html,建议使用伪静态或者分目录存储静态页面。网络磁盘,磁盘矩阵的使用。
5. 网站安全性要求高,不愿意被seo,或者不希望数据曝光给spider,不要使用静态化
6. 大型网站中,静态化技术是综合的。
展开阅读全文