PHP如何应对高并发
在之前的工作中,并没有接触过也没有处理过高并发,但是高并发是必须要学习的,在现在的公司没有技术leader,所以,高并发以及优化的一些问题需要自己去考虑并且解决。
解决方案
一:什么是高并发?
高并发指的是并发数量,是指同一时间有多少个访问同时来访问同一api接口或者url地址。
二:高并发相关概念
(1)(每秒查询率):每秒请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);
a) 使用ab对Nginx进行压力测试
b) Mysql状态查看QPS
(2)PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量(注:同一个人浏览你的网站的同一页面,只记做一次pv);
a) PV的统计:PV是每次加载页面都加1;
(3)UV(Unqie Vistor):独立访客,一定时间范围内,相同访客多次访问网站,只计算为1个独立访客;
(4)吞吐量(fetches/sec) :单位时间内处理的请求数量 (通常由QPS和并发数决定);
(5)响应时间:从请求发出到收到响应花费的时间;
(6)带宽:计算带宽需关注两个指标,峰值流量和页面的平均大小;
(7)日网站带宽: PV/统计时间(换算到秒) * 平均页面大小(kb)* 8;
注意事项:
(1)QPS不等于并发连接数(QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数量);
(2)峰值每秒请求数(QPS)= (总PV数*80%)/ (六小时秒数*20%)【代表80%的访问量都集中在20%的时间内】;
(3)压力测试: 测试能承受的最大并发数 以及测试最大承受的QPS值;
(4)常用的性能测试工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】
三、优化
四、解决方案案例
location ~* \.(gif|jpg|png|webp)$ {
#指令valid_referers 全局invalid_referer
valid_referers none blocked domain.com *.domain.com ;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.domain.com/403.jpg;
}
}
b) 加密签名:通过签名,根据计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息
加密签名 (安全性高)
b) 加密签名:通过签名,根据计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息
加密签名 (安全性高)
#以Nginx为例,前提加载第三方模块HttpAccessKeyModule实现防盗链
location ~* \.(gif|jpg|png|webp)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg key;
accesskey_signature "mysrc$remote_addr";
}
(2)前端优化;
减少http请求次数;
a) CSS Sprites(雪碧图) -- 合拼图片,再使用css的background-image和background-position来指定显示元素 CSS Sprites与图片地图性能差不多,但CSS Sprites更加简单灵活;
b) 合并JS与CSS文件 -- 加载一个JS文件比加载多个JS文件要快,一般会使用前端自动构建工具打包合并;
c) 图片使用base64编码 -- 图片base64除了可以使用在<img>中,还可以使用在css的background-image中;
d) 图片地图 -- 把多张图片合成一张,再使用<map>标签来实现对图片上不同区域的链接;
2. 添加异步请求,当用户触发某个事件之后,再异步请求数据;
3. 启用浏览器缓存和文件压缩;
4. CDN加速;
5. 将图片以及文件类放在其他服务器上(减少I/O);
(3)服务端优化;
1. 页面静态化处理;
2. 并发处理;
3. 队列处理;
(4)数据库优化;
1. 数据库缓存;
2. 数据库读写分离;
a) 对于高并发系统来说,一开始都是读多写少,大量的读请求经过业务层到达持久层之后对数据库产生了极大的压力,此时就会准备一个和生产库一致的数据库来单独接收处理读请求,一般这个叫做从库,也会被称为读库,高并发流量中的读请求会被引流到从库,而写请求还是在主库写,主库和从库之间依靠主从复制机制来确保两个库的数据近乎实时一致,这样用户在读请求的时候几乎发现不了数据的不一致。
3. 对数据库进行分库、分表;
a) 读写分离主要是为了应对读请求,那如果写请求的流量大,就会考虑用到对数据库进行分库分表操作;
4. 负载均衡;
(5)WEB服务器优化;
Nginx反向代理实现负载均衡;
lvs实现负载均衡;