一般情况下,PHP本身的性能对项目的影响较小,一般从以下三个方面考虑优化:
- PHP 语言级的性能优化
- PHP 周边问题的性能优化
- PHP 语言自身分析、优化
在做优化之前,可以通过压力测试工具来评测,可以使用 ab
, wrk
等工具进行压测。
# wrk (recommend)
# This runs a benchmark for 30 seconds, using 12 threads, and keeping 400 HTTP connections open.
wrk -t 12 -c 400 -d30s https://www.cizel.cn/
- Requests/sec:每秒接收请求(QPS)
是什么
:自写代码冗余较多,可读性不佳,并且性能低。
为什么
:PHP 代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。
怎么做
:多使用 PHP 内置变量,常量,函数。
是什么
:PHP 内置函数. 之间依然存在快慢差异
怎么做
:多去了解 PHP 内置函数的时间复杂度
是什么
:PHP 提供的魔法函数,性能不佳
为什么
:为了给 PHP 程序员省事,PHP 语言为你做了很多
怎么做
:尽可能规避使用 PHP 魔法函数
是什么
:PHP 提供的错误抑制符只是方便懒人
为什么
:在@的实际逻辑,代码开始前、结束后、增加Opcode,忽略报错
怎么做
:建议 尽量不要使用 @错误抑制符,多使用try catch
是什么
:PHP 有内存回收机制保底,但也请小心内存
怎么做
:利用unset() 及时释放不使用的内存(注:unset() 出现注销不掉的情况 )
是什么
:正则表达式的回溯开销较大,「没有金刚钻别揽瓷器活」
怎么做
:利用字符串处理函数,实现同样的逻辑
是什么
:循环内的计算式将会被重复计算
怎么做
:不在循环中重复计算,以及DB操作
是什么
:PHP 不适合密集型运算的场景
为什么
:PHP 语言特性决定了 PHP 不适合做大数据运算
怎么做
:适合衔接Webserver 与后端服务、UI呈现
是什么
:PHP 与将没有引号的键值当做常量,产生查找常量的开销
怎么做
:严格使用引号作为键值
PHP周边都有什么?
- Linux 服务器
- 文件存储 (硬盘)
- 数据库
- 缓存 (内存)
- 网络 (分布式架构)
PHP 周边对 PHP 程序的影响:
DB.php
约等于 网络
+ 数据库(DB)
常见 PHP 场景的开销次序:
读写磁盘、读写数据库、读写内存、读写网络数据
读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据
-
设置超时时间
- 连接超时 (建议值:
200ms
) - 读超时 (建议值:
800ms
) - 写超时 (建议值:
500ms
)
- 连接超时 (建议值:
-
串行请求并行化
- 使用 curl_multi_*()
- 使用
swoole
拓展
使用Gzip 压缩输出的内容
多次请求,内容不变的情况,可以考虑使用缓存
使用缓存的拓展:
- Opcode Cache
- Memcached
- yac
拓展实现:通过 PHP 拓展替代原 PHP 代码中高频逻辑
终极方案:更换Golang or Java 语言