题外话:大流量技术:
1.服务器集2.mysql优化(设计合理的数据库表3nf,分表垂直分割水平分割,读写分离技术多个mysql同时工作,mysql配置优化,硬件升级)3.缓存技术memched/redis。.大型网站提速提速:Mysql优化,页面静态化,memcached大型网站的定义:
1. pv值(page views):页面的访问量。当页面访问量很大的时候,带来了很多问题:
1 流量变大,解决方案 买带宽,优化程序,图片的大小不能多于多少K
2 并发量变大,同时访问网站的人多了,解决方案,要对程序的结构进行修整->服务器集
传统架构:
优化结构:
整个的重点还是php程序,考验程序员的东西。
2. 数据量很大:解决方法:
1 表的设计合理
2 分表技术(垂直分割和水平分割)、建立适当的索引、读写分离、Mysql配置优化(调整最大并发量,定时对数据库碎片整理、碎片,实现方法:windows下用任务管理器,niux下用crontab),硬件升级
3 页面静态化
4 缓存技术(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 localhost/ phpstatic/ test.php
当我们调整访问人数为1000的时候:
很悲剧的事情发生了,说明我们的apache服务器支撑不住了。解决方案,我们需要调整apache的最大并发量。
MPM(多路处理模块,就是指明apache怎样处理并发):apache处理并发的方式。有三种方式
1. perfork 预处理进程方式:预先准备一些进程,等待请求的到来,这样的方式消耗很大。
2. worker 工作模式:预先开启进程,当有请求的时候,进程会开启线程,线程为请求服务。一个进程可以开启多个线程
3. winnt模式 windows下采用的:就是worker模式
简单的说是这样的:
如何设置apache最大并发数:
1.位置f文件中,大约php模板引擎原理470多行。
# Server-pool management (MPM specific)
Include conf/f
2.确定apache的工作模式:
cmd下进入apache的bin目录,输入 –l(小写的L) ;
我们主要看mpm_yyyyy ,如果这个yyyy是什么,就说明是什么工作模式了。
3.去修改f
调整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缓存就可以解决
1 配置php.ini,output_buffering=4096(字节)
2 在程序中开启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()函数,获取当前时间函数。
上面的解决方案仍然会有时间延迟,随意我们采用第二套方案,这样做就没有时间延迟了
页面静态化的第二套技术:模板替换技术(正则表达式):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论