PHP 性能优化初探
什么情况下,会遇到了 PHP 性能问题?
- PHP 语法使用得不恰当
- 使用 PHP 语言做了它不擅长做的事情
- 使用 PHP 语言连接的服务不给力
- PHP 自身的短板
- 尚未排查出的问题
PHP 性能问题简析
PHP 的性能问题,占整体项目性能问题的比例一般是三成,但也不仅仅局限于对 PHP 的性能优化。
PHP 的性能问题的解决方向,优化难度是从简单到困难
- PHP 语言级的性能优化
- PHP 周边问题的性能优化
- PHP 底层级的性能优化
压力测试工具简介
Apache Benchmark(ab)
简介
ApacheBench 是 Apache 服务器自带的一个web压力测试工具,缩写为 ab ,旨在高压高并发下体现出各种问题和瓶颈.
ab 命令会模拟多个用户同时访问一个url (伪装一个并发访问的环境).
此命令对本地cpu要求不高,内存要求也不多,但是会对访问目标服务器造成严重的负载甚至资源耗尽而宿机,很类似与cc攻击.
如何使用
./ab -n1000 -c100 http://www.baidu.com/,其中 -n 是请求书,-c 是并发数,后面的是压测地址。
压测呈现的数据,比较重要的三个
- Requests per second: 每秒处理的请求
- Time per request: 每处理一个请求所消耗的时间
- Time taken for test: 完成这次压测所消耗的时间
PHP 语言级的性能优化
优化点:产生额外开销的错误抑制符 @
- 情况描述:PHP 提供的错误抑制符只是为了方便懒人
- @ 的实际逻辑:在代码开始前、结束后,增加 Opcode,忽略报错
- vld - PHP Opcode 查看扩展
举例说明:file_get_contents()
1php -dvld.active=1 -dvld.execute=0 XXX.php 只查看不执行好的建议:尽量不要使用 @ 错误抑制符
优化点:合理使用内存
- 情况描述:PHP 有内存回收机制保底,但也请小心使用内存
- 好的建议:利用 unset 及时释放不使用的内存
优化点:减少计算密集型业务
- 情况描述:PHP 不适合密集型运算的场景
- 为什么:PHP 语言特性决定了 PHP 不适合做大数据量运算
- PHP 使用场景:适合衔接 Webserver 与后端服务、UI 呈现
优化点:务必使用带引号字符串做键值
- 情况描述:PHP 会将没有引号的键值当做常量,产生查找常量的开销
- 好的建议:严格使用引号作为键值
PHP 周边问题的性能优化
- Linux 环境
- 网络的性能
- 缓存的性能
- 数据库的性能
- 服务器硬盘的性能
php => 网络 =》 DB 的场景,找出问题的和核心,并且找到大头去优化。
减少文件类操作:
- PHP 常见的开销场景
- 读写硬盘
- 读写数据库
- 读写内存
- 读写网络数据
- PHP 常见的开销场景的开销次序
- 读写内存 小于 读写数据库
- 读写数据库 小于 读写硬盘
- 读写硬盘 小于 读写网络数据(网络延迟)
- 读写数据库、读写硬盘、读写网络数据都是基于文件类操作
- 优化网络请求
- 问题
- API 的不确定因素
- 网络稳定性
- 如何优化
- 1.设置超时时间
- 连接超时 200ms
- 读超时 800ms
- 写超时 500ms
- 2.将串行请求并行化
- 使用 curlmulti*()
- 使用 Swoole 扩展
- 1.设置超时时间
- 问题
压缩 PHP 接口输出
- 如何压缩
- 使用 Gzip 即可
- 压缩输出的利与弊
- 利于我们的数据输出, Client 端能更快获取数据
- 额外的 CPU 开销(如果传输数据大于 100 KB,能取得不错的效果)
缓存重复计算内容
- 什么情况下做输出内容的缓存
- 多次请求,内容不变情况
重叠时间窗口思想:
- 串行
- 重叠时间窗口思想
如果后一个请求不强依赖前一个请求的返回结果,可以使用将网络请求并行化。
旁路方案
如果后一个请求不强依赖前一个请求的返回结果,可以使用旁路方案。
PHP 性能问题的具体分析
工具:XHPorf(源自 Fackbook 的 PHP 性能分析工具)
实践:通过分析 Wordpress 程序,做优化
PHP 性能瓶颈解决方法
Opcode Cache: PHP 扩展 Yac
扩展实现:通过 PHP 扩展代替原 PHP 代码中高频逻辑
Runtime 优化:HHVM,PHP-JIT