## PHP性能优化
1. PHP语法使用的不恰当。
2. 使用PHP语言做了它不擅长做的事。
3. 用PHP语言连接的服务不给力。
4. PHP自身的短板。
5. 我也不知道的问题。
## PHP性能占比
1. PHP性能问题,占用整个项目的整体性能30%-40%之间。
2. PHP语言级的性能优化。
3. PHP周边问题的性能分析。比如,服务器环境,硬件配置,数据库配置。
4. PHP语言自身分析,优化。底层C的分析。
5. 2、3、4是有简单到复杂的过程。
## 压力测试工具简介
### Apache Benchmark(ab)
#### 如何使用
~~~
./ab -n1000 -c100 http://www.baidu.com/
-n请求数 总共发起1000次请求
-c并发数 一次的并发量是100
url 目标压测地址
~~~
性能优化之前使用ab
性能优化之后使用ab
对比吞吐量和处理耗时
ab测试主要关注系统<span style="color:red">吞吐量</span> 和 <span style="color:red">服务器处理时间</span>这两个点。
## PHP语言级性能优化
1. 少些代码,多用PHP自身能力。
2. 自写代码冗余比较多,可读性不佳,并且性能差。
3. php代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。
4. 多使用PHP内置变量、常量、函数。
## PHP代码运行流程
![](https://box.kancloud.cn/cef99c401b9ab96d0843755173e991bf_2012x920.jpeg)
1. PHP内置函数的性能优劣。
2. 尽量少用魔法函数(为了给PHP程序员省事,PHP语言为你做了很多)
产生额外开销的错误抑制符@
情况描述:PHP提供的错误抑制符@只是为了方便懒人。会增加额外开销。
vld PHP Opcode 查看扩展
#### 1)合理使用内存
PHP有内存回收机制保底,但也请小心使用内存。
可以利用unset()及时释放不使用的内存。
#### 2)尽量少的使用正则表达式
利用字符串处理函数,实现相同逻辑。
#### 3)避免在循环内做运算
循环内的计算式将会被重复计算。
~~~
$str = "hello world";
for($i=0;$i<strlen($str);$i++){
//do something strlen 会计算多次。
}
~~~
#### 4)PHP不适合密集型运算场景
PHP的语言特性决定了PHP不适合做大数据量运算。
#### 5)PHP适合衔接Webserver与后台服务,UI呈现。
#### 6)务必使用带引号字符串做键值。
php会将没有引号的键值当做常量,产生查找常量的开销。
## PHP周边环境
1)linux服务器
2)硬盘是硬件
3)mysql是软件
4)apache
5)内存
![](https://box.kancloud.cn/31f5a2aae1feba28359e8b2a45dd8e9c_2478x1178.jpeg)
#### 减少文件类的操作
PHP场景开销次序
1. 读写磁盘
2. 读写数据库
3. 读写内存
4. 读写网络数据
读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据(其实是磁盘操作+网络延迟)
#### 优化网络请求
1. 对方接口不确定因素。
2. 网络稳定性。
3. 设置超时时间,1、连接超时200ms,2、读超时800ms,3、写超时500ms
4. 将串行请求并行化。使用 curl_multi_*();,使用swoole扩展。
#### 压缩PHP接口输出
使用Gzip即可。压缩后更快传输数据,但是会产生额外的CPU开销。
#### 缓存重复计算内容
多次请求内容不变情况。
#### 重叠时间窗口理想
PHP是串行执行的。
前后任务没有强依赖关系,可以使用重叠时间窗口
![](https://box.kancloud.cn/837cfe64cc4812bc069882de6f8ce8dd_2166x1136.jpeg)
#### 旁路方案
![](https://box.kancloud.cn/f10ca872542e402f3812d29ec3122f64_2238x1204.jpeg)
xhprof 工具分析PHP性能。
https://www.jianshu.com/p/c420ebe6ce39
### php性能瓶颈终极提升
Opcode Cache:PHP扩展APC,APC缓存PHP编译后的代码。
Runtime优化:HHVM
- 简介
- Cookie
- HTML5 LocalStorage
- session
- 当浏览器关闭后,Session就销毁了吗?
- mysql数据库保存session
- HTTP协议的由来
- fsockopen异步请求
- http防盗链
- Apache伪静态知识补充
- 大并发量解决方案
- 大型网站是怎样解决多用户高并发访问
- 网站高并发 大流量访问的处理及解决方法
- 并发数与在线客户数 注册用户数的关系
- 即时聊天程序
- 反向Ajax实现
- ob缓存作用
- 浅聊并发之战
- php扩展安装
- php安装redis扩展
- SQLMap自动化实施SQL注入共计
- 命名空间namespace
- 集群和分布式之【session共享】
- php Redis存储Session 【1】
- php Redis存储Session 【2】
- php mysql存储session【1】
- php缓存
- 文件缓存
- memcache和redis的比较
- 原生session与session in redis对比
- XSS攻击【1】
- XSS攻击【2】
- PHP消息队列
- php+mysql 模拟发送邮件队列
- php+mysql 模拟订单处理队列
- php+redis 模拟秒杀队列
- RabbitMQ 消息队列系统
- beanstalkd
- PHP构建即时通讯
- WebSocket协议
- workerman
- PHP变量的作用域
- PHP传值和传引用的区别
- PHP匿名函数
- PHP递归函数&应用
- PHP单例模式
- PHP性能优化
- RESTful
- 集群
- 增加pgsql扩展
- php.ini路径查找
- Swoole Compiler
- mysql 主从
- 主从
- mysql-proxy
- window docker环境