先说最核心的一环:OPcache。它是PHP官方的一个扩展,思路很简单——把编译好的字节码缓存起来,省得每次请求都重新解析编译。在Debian上安装只需一条命令:sudo apt install php-opcache(PHP 5.5以上版本自带)。装完之后,关键在配置。打开php.ini,找到opcache段,下面这几个参数值得仔细调:

[opcache]zend_extension=opcache.soopcache.enable=1opcache.memory_consumption=128# 缓存内存大小(MB),根据服务器内存调整opcache.interned_strings_buffer=8# 内部字符串缓冲区大小(MB)opcache.max_accelerated_files=4000# 最大加速文件数,建议设置为项目中PHP文件总数的1.5倍opcache.revalidate_freq=60# 文件修改检查频率(秒),生产环境可设为0(禁用检查)或较高值
别忘了重启PHP服务让配置生效:sudo systemctl restart php-fpm。
优化PHP-FPM配置
如果你用的是PHP-FPM(强烈推荐),那进程管理这块就是性能的关键。调到合适了,服务器资源利用率会好很多;调错了,要么白白浪费内存,要么请求排队等到崩溃。编辑/etc/php/{version}/fpm/pool.d/www.conf,重点关注以下参数:
pm = dynamic# 动态进程管理模式(推荐)pm.max_children = 50# 最大子进程数,根据服务器内存计算(如1GB内存可设为20-30)pm.start_servers = 5# 启动时的子进程数pm.min_spare_servers = 5# 最小空闲子进程数pm.max_spare_servers = 10# 最大空闲子进程数request_terminate_timeout = 300# 请求超时时间(秒),防止单个脚本占用过多资源
修改完后同样重启PHP-FPM:sudo systemctl restart php-fpm。
代码层面的细节
优化不只是运维的事,代码写得好不好,对性能影响也很大。几点常见建议:
- 用好静态类型声明:PHP 7+支持参数和返回值的类型声明,这样做可以帮Zend引擎省掉一部分类型检查开销。比如:
function add(int $a, int $b): int {return $a + $b;} - 减少循环内的函数调用:比如在循环里反复调
strlen(),不如提前把结果存到变量里。 - 优先用单引号:单引号字符串不会解析变量,效率比双引号高一点点——积少成多。
- 多用内置函数:像
array_map()、strpos()这些,底层是用C实现的,自己手写循环基本比不过。 - 处理大数据用生成器:用
yield代替一次性加载全部数据,内存占用可以降一个数量级。例如:function getLargeData() {for ($i = 0; $i < 1000000; $i++) {yield $i;}} - 减少文件操作:频繁读写文件非常慢,能批量就批量,能缓存就缓存(比如用Redis)。
数据库优化
数据库经常是瓶颈所在,这一点跑不掉。几个方向:
- 持久连接:用
p:前缀可以让MySQLi复用连接,减少握手的开销:$mysqli = new mysqli('p:localhost', 'user', 'password', 'database'); - SQL查询优化:该加索引的地方加索引(
CREATE INDEX idx_column ON table_name(column_name);),避免SELECT *,只取需要的字段,能少用JOIN就少用。 - 连接池:高并发场景下,用Swoole这类工具维护连接池,避免频繁创建销毁连接。
缓存策略
缓存是性能翻跟斗,没有之一。两种常见做法:
- 数据缓存:把数据库查询结果或计算中间结果放到Redis或Memcached里。比如:
$redis = new Redis();$redis->connect('127.0.0.1', 6379);$data = $redis->get('cache_key');if (!$data) {$data = fetchDataFromDatabase();$redis->set('cache_key', $data, 3600);// 缓存1小时} - 页面缓存:用Nginx或Varnish把整个页面或者页面片段缓存起来,让PHP少执行甚至不执行。
Web服务器优化
Nginx这边也有一些顺手就能做的小优化:
- 开启Gzip压缩:减少传输体积,提升加载速度。
gzip on;gzip_comp_level 6;gzip_min_length 256;gzip_proxied any;gzip_vary on; - 启用HTTP/2:多路复用效果明显,前提是Nginx版本不低于1.9.5。
- 配置KeepAlive:减少TCP握手的开销。例如:
keepalive_timeout 65;keepalive_requests 100; - 调整fastcgi_pass:确保指向正确的PHP-FPM socket,避免用TCP回环地址,Unix socket通常更快。比如:
unix:/run/php/php8.2-fpm.sock;
监控与分析
光调不测,等于白忙。得让数据说话:
- 性能分析工具:Xdebug、Blackfire这些能帮你找到慢函数、内存消耗大户。
- 系统资源监控:跑一下
top、htop、vmstat,看看CPU、内存、磁盘I/O有没有异常,再反过来调整配置。 - 错误日志:在
php.ini中开启错误日志(log_errors = On,error_log = /var/log/php_errors.log),很多性能问题其实都能从日志里找到线索。