PHP在Linux下的性能调优:多层面优化策略
systemctl disable <service>命令禁用不必要的后台服务(如蓝牙、打印服务等),释放CPU、内存等系统资源,减少对PHP应用的资源竞争。/etc/sysctl.conf文件优化网络与文件系统性能,例如增加TCP连接队列长度(net.core.somaxconn=1024)、调整文件描述符限制(fs.file-max=65535),提升高并发下的连接处理能力。mount命令调整挂载参数(如noatime减少文件访问时间更新,提升IO效率)。PHP-FPM(FastCGI Process Manager)是Linux下PHP应用的常用进程管理工具,其配置直接影响PHP脚本的执行效率。
pm.max_children(最大子进程数,根据服务器内存计算,如可用内存/单个PHP进程内存)、pm.start_servers(启动时的子进程数,建议为max_children的1/4~1/2)、pm.min_spare_servers(最小空闲子进程数,避免频繁创建进程)、pm.max_spare_servers(最大空闲子进程数,避免资源浪费)。pm.process_idle_timeout(进程空闲超时时间,超过则终止,如10s),减少闲置进程的资源占用。pm.max_children为预估的最大并发数,避免动态调整的开销。request_terminate_timeout:设置单个请求的超时时间(如30s),防止因脚本死循环或慢查询导致进程阻塞。slowlog:开启慢查询日志(如slowlog = /var/log/php-fpm/www-slow.log),并设置slowlog_latency(慢查询阈值,如10s),便于定位性能瓶颈。pm.status_path:开启状态监控路径(如pm.status_path = /status),通过nginx或curl访问该路径,实时查看PHP-FPM的进程状态(如活跃进程数、空闲进程数)。OPcache是PHP内置的opcode缓存扩展,可缓存预编译的PHP脚本,避免每次请求都重新解析、编译,显著提升PHP执行效率。
php.ini中添加或修改以下配置:zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1 # 允许命令行模式下使用OPcache
opcache.memory_consumption:设置OPcache缓存的内存大小(如128M),根据服务器内存调整,建议为可用内存的1/4~1/2。opcache.max_accelerated_files:设置可缓存的脚本文件数量(如4000),需大于项目中PHP文件的总数(可通过find /path/to/project -name "*.php" | wc -l统计)。opcache.revalidate_freq:设置缓存验证频率(如60s),即每60秒检查一次脚本是否修改,平衡性能与代码更新及时性。// 不好的写法:每次循环都调用count()
for ($i = 0; $i < count($array); $i++) {
// 逻辑
}
// 好的写法:提前计算count()
$count = count($array);
for ($i = 0; $i < $count; $i++) {
// 逻辑
}
$cache = new Redis();
$cache->connect('127.0.0.1', 6379);
$data = $cache->get('hot_data');
if (!$data) {
$data = $db->query('SELECT * FROM hot_table')->fetchAll();
$cache->set('hot_data', $data, 3600); // 缓存1小时
}
SELECT *,只查询需要的字段(如SELECT id, name FROM users)。ALTER TABLE users ADD INDEX idx_name (name)),加速条件查询。worker_processes auto;(根据CPU核心数自动设置,充分利用多核资源)。events { worker_connections 1024; }(每个worker进程的最大并发连接数,建议设置为1024~4096)。gzip on; gzip_types text/plain text/css application/json application/javascript;(压缩HTML、CSS、JS等文本资源,减少传输体积,提升页面加载速度)。location ~* \.(jpg|jpeg|png|gif|css|js)$ { expires 30d; }(设置静态文件的缓存时间为30天,减少重复请求)。<IfModule mpm_event_module>...</IfModule>),替代传统的Prefork模式(Prefork适合兼容性要求高的场景,但内存消耗大),提升高并发下的性能。KeepAlive On; KeepAliveTimeout 65;(保持客户端与服务器的连接,减少TCP握手开销,适合多个请求的页面)。fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
location ~ \.php$ {
fastcgi_cache my_cache;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_use_stale error timeout updating http_500 http_503;
}
}
session.save_handler = redis),提升会话读取速度。top、htop(查看CPU、内存使用情况)、vmstat(查看系统IO、进程状态)、ss(查看网络连接状态)等命令实时监控系统资源;使用php-fpm status(查看PHP-FPM进程状态)、New Relic(应用性能监控)、Blackfire(代码性能分析)等工具监控PHP应用的性能指标(如响应时间、QPS、错误率)。error_log)、慢查询日志(slowlog),定位性能瓶颈(如未优化的SQL查询、代码逻辑问题)。