Skip to content

Latest commit

 

History

History
141 lines (79 loc) · 3.82 KB

php-performance-optimization.md

File metadata and controls

141 lines (79 loc) · 3.82 KB

PHP性能优化建议

一般情况下,PHP本身的性能对项目的影响较小,一般从以下三个方面考虑优化:

  • PHP 语言级的性能优化
  • PHP 周边问题的性能优化
  • PHP 语言自身分析、优化

0x00压力测试工具

在做优化之前,可以通过压力测试工具来评测,可以使用 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)

0x01 PHP语言级的性能优化

优化点1. 少些代码,多用PHP自身的能力

是什么:自写代码冗余较多,可读性不佳,并且性能低

为什么:PHP 代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。

怎么做:多使用 PHP 内置变量,常量,函数。

优化点2. PHP 内置函数的性能优化

是什么:PHP 内置函数. 之间依然存在快慢差异

怎么做:多去了解 PHP 内置函数的时间复杂度

优化点3. 尽可能少用魔法函数

是什么:PHP 提供的魔法函数,性能不佳

为什么:为了给 PHP 程序员省事,PHP 语言为你做了很多

怎么做:尽可能规避使用 PHP 魔法函数

优化点4. 产生额外开销的错误抑制符 @

是什么:PHP 提供的错误抑制符只是方便懒人

为什么:在@的实际逻辑,代码开始前、结束后、增加Opcode,忽略报错

怎么做:建议 尽量不要使用 @错误抑制符,多使用try catch

优化点5. 合理使用内存

是什么:PHP 有内存回收机制保底,但也请小心内存

怎么做:利用unset() 及时释放不使用的内存(注:unset() 出现注销不掉的情况 )

优化点6. 尽量少的使用正则表示式

是什么:正则表达式的回溯开销较大,「没有金刚钻别揽瓷器活」

怎么做:利用字符串处理函数,实现同样的逻辑

优化点7. 避免在循环内做运算

是什么:循环内的计算式将会被重复计算

怎么做:不在循环中重复计算,以及DB操作

优化点8. 减少计算密集型业务

是什么:PHP 不适合密集型运算的场景

为什么:PHP 语言特性决定了 PHP 不适合做大数据运算

怎么做:适合衔接Webserver 与后端服务、UI呈现

优化点9. 务必使用带引号字符串做键值

是什么:PHP 与将没有引号的键值当做常量,产生查找常量的开销

怎么做:严格使用引号作为键值

0x02 PHP周边问题的性能优化

PHP周边都有什么?

  • Linux 服务器
  • 文件存储 (硬盘)
  • 数据库
  • 缓存 (内存)
  • 网络 (分布式架构)

PHP 周边对 PHP 程序的影响:

DB.php 约等于 网络 + 数据库(DB)

优化点1. 减少文件类操作

常见 PHP 场景的开销次序:

读写磁盘、读写数据库、读写内存、读写网络数据

读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据

优化点2. 优化网络请求

  1. 设置超时时间

    • 连接超时 (建议值:200ms)
    • 读超时 (建议值: 800ms)
    • 写超时 (建议值: 500ms)
  2. 串行请求并行化

    • 使用 curl_multi_*()
    • 使用 swoole 拓展

优化点3. 压缩 PHP 接口输出

使用Gzip 压缩输出的内容

优化点4. PHP缓存复用

多次请求,内容不变的情况,可以考虑使用缓存

0x03 PHP 语言本身的优化

使用缓存的拓展:

  • Opcode Cache
  • Memcached
  • yac

拓展实现:通过 PHP 拓展替代原 PHP 代码中高频逻辑

终极方案:更换Golang or Java 语言