想起来记录一下自己对 PHP 的优化思路
针对 Nginx 和 PHP-FPM 进行优化
首先应该分为代码层面, 配置层面, 架构层面
代码层面 参见了 https://segmentfault.com/a/1190000009442044 这篇文章
1. 减少 PHP 代码量
显而易见, PHP 作为解释性语言, 每次执行都要解析编译到 OPCODE, 如果代码量越大, 需要从 PHP 代码解析到 OPCODE 的工作量就越大, 这时, 可以尝试尽量多的采用系统内置函数. PHP 系统对 String Array File 等操作函数很多, 其底层实现为 C, 自然要比我们写 PHP 代码要来的快.
2. 错误抑制符号 @ 尽量不用, 会影响性能
3. 少用正则表达式, PHP 自带 String 相关函数功能很强大, 类似 strstr() strrchr() strpos() strrpos()等, 因为正则表达式会导致过多的回溯, 比较占用 CPU.
4. 避免在循环内做计算
ZendEngine 也许 (TODO: 使用 VLD 扩展去论证) 不够聪明, 循环内每次循环都会做相应的计算.
- eg:
- <?php
- $arr = range(1,1000);
- for($i = 0;$i < count($arr);$i++){//sth}
- // 这会导致每次循环都计算 count, 因此效率会低一些
5. 类内方法, 非必需面向对象, 定义为 Static 会提升性能
6. 误区: require,include 等函数在使用带变量的引入其他脚本, 会导致性能缺失嘛? 不会, realpath _cache 了解一下
7.switch 性能优于 if elseif 因为 switch 在比较的时候, 底层会形成类似 HashMap 的结构, 以 O(1)的效率找到执行分支, if 不会.
8. 非必需情况下, 少使用全局变量.
9.$i++ 会比 $++i 慢一些, 但是 ZendEngine 会优化掉.
10.foreach 效率更高
配置层面 (自己的认识还比较浅薄)
1. php-fpm 运行模式 https://blog.csdn.net/baidu_21154279/article/details/54929664
如果内存大, 使用静态模式, pm.workers 数量为 内存大小 / 30M 避免线程开闭导致的开销
如果内存小, 使用动态模式 pm workers 数量为 内存大小 / 20M
动态模式能更好的规避内存泄露相关问题, 例如 exec 执行某些指令失败, 可以考虑重启 FPM(USR2)
2.php OPCACHE
使用 Opcache 扩展能更好的提升性能, 其默认缓存最小粒度当然是脚本文件, 缓存根据是脚本的 mtime , 因此注意 rsync 带来的坑, 默认缓存文件个数为 2k, 默认缓存时间 1s 后自动检查更新.
3.php realpath cache
使用 realpath cache 能更好的令 PHP 进行 require include 等操作.
4.php-fpm 与 nginx 的沟通模式
默认使用 TCP socket 进行沟通, 如果 PHP 和 nginx 是 1:1 的关系, 那么不妨使用 Unix socket , 这样能减少 TCP 协议相关压力, 避免回环, 提升性能, 但是可能稳定性会稍微降低一些.
5. 数据库 presistent 持久链接配置启动, 可以实现长连接, 提升性能.
架构层面
1. 使用 Cache, 类似 Memcache,Redis 等, 减少数据库压力(注意缓存穿透时的回原压力)
2. 使用 MQ 进行削峰, 异步调度总能性能更加
3. 接入层负载均衡, 可以根据不同的配置, 分发不同的权重等
4.DB 读写分离
来源: http://www.bubuko.com/infodetail-2763943.html