1. 启用并优化OPcache(最核心优化)
OPcache是PHP内置的操作码缓存扩展,可避免重复解析、编译脚本,直接执行缓存的操作码,显著降低CPU和磁盘I/O开销。
sudo yum install php-opcache安装,编辑/etc/php.ini添加以下配置:[opcache]
zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable=1
opcache.enable_cli=1 # 若需CLI脚本(如Composer)也受益
opcache.memory_consumption=128 # 共享内存大小(MB),根据应用规模调整(建议128MB以上)
opcache.max_accelerated_files=4000 # 可缓存的最大文件数(建议为项目PHP文件数的1.5-2倍,避免缓存未命中)
opcache.revalidate_freq=0 # 生产环境设为0,完全信任缓存,不检查文件更新(需部署后手动清缓存)
opcache.validate_timestamps=0 # 生产环境禁用,避免频繁检查文件时间戳
opcache.interned_strings_buffer=8 # 字符串缓存区大小(MB),对大量使用字符串的应用(如框架)建议调至16MB
opcache.fast_shutdown=1 # 启用快速关机,进程结束时直接标记内存为可用,减少清理开销
sudo systemctl restart php-fpm或调用opcache_reset()函数),确保新代码生效。2. 优化PHP-FPM配置(提升进程管理效率)
PHP-FPM(FastCGI进程管理器)负责管理PHP进程,合理的配置可提高资源利用率,减少延迟。
/etc/php-fpm.d/www.conf中,将pm设为dynamic(动态调整进程数,适合大多数场景),并设置:pm.max_children = 50 # 最大子进程数(根据服务器内存计算:(可用内存 - 1G)/单个进程内存,如16G内存可用约15G,单个进程约100MB,则设为150)
pm.start_servers = 5 # 启动时的进程数
pm.min_spare_servers = 5 # 最小空闲进程数(避免频繁创建进程)
pm.max_spare_servers = 35 # 最大空闲进程数(避免占用过多内存)
pm.max_requests = 500 # 每个子进程处理的最大请求数(防止内存泄漏,达到后重启进程)
rlimit_files(文件描述符限制)至10240以上,避免高并发下文件描述符耗尽:rlimit_files = 10240
sudo systemctl restart php-fpm使配置生效。3. 升级到最新稳定版PHP
新版本PHP通常包含性能改进、bug 修复和新特性(如PHP 8的JIT编译)。通过sudo yum update php升级到最新稳定版(如PHP 8.3),可显著提升运行效率。
4. 使用高效的Web服务器(减少请求处理开销)
/etc/nginx/conf.d/example.conf):server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
worker_processes为CPU核心数(auto),使用epoll事件模型,增加worker_connections(如1024):worker_processes auto;
events {
worker_connections 1024;
use epoll;
}
修改后重启Nginx:sudo systemctl restart nginx。5. 使用缓存系统(减少数据库和计算开销)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$users = $redis->get('users');
if (!$users) {
$users = $mysqli->query('SELECT * FROM users')->fetch_all(MYSQLI_ASSOC);
$redis->set('users', $users, 3600); # 缓存1小时
}
6. 代码级优化(减少资源消耗)
strlen()),将不变的值缓存到变量中。array_map()、array_filter()等函数替代foreach循环,提高处理效率。int、string),减少内部类型检查开销。disable_functions禁用危险且不使用的函数(如exec、system),减少安全风险和资源占用:disable_functions = exec,passthru,shell_exec,system
(注意:若应用需要这些函数,需谨慎禁用)7. 数据库优化(减少数据库瓶颈)
SELECT *(只查询需要的字段),使用EXPLAIN分析查询性能。mysqli或PDO的持久连接(p:前缀),减少每次查询重新建立连接的开销:$mysqli = new mysqli('p:localhost', 'username', 'password', 'database');
8. 监控与持续调优(确保优化效果)
top、htop监控CPU和内存使用,vmstat监控磁盘I/O,php-fpm status监控PHP-FPM进程状态(如活跃进程数、请求处理时间)。