优化PHP代码减少文件操作
避免在循环中频繁调用require/include(改用require_once/include_once防止重复加载),减少不必要的文件读写;将静态资源(图片、CSS、JS)交给Web服务器(如Nginx)直接处理,避免PHP进程参与;使用生成器(yield)处理大型数组/对象,避免一次性加载全部数据到内存。
启用并配置OPcache字节码缓存
OPcache是PHP内置扩展,可缓存预编译的字节码,避免每次请求都重新解析、编译PHP文件,显著减少磁盘I/O。安装命令:sudo apt install php-opcache;配置关键参数(/etc/php/8.x/fpm/php.ini):opcache.enable=1(启用)、opcache.memory_consumption=256(缓存大小,根据代码量调整)、opcache.max_accelerated_files=20000(最大加速文件数)、opcache.revalidate_freq=60(60秒检查文件更新,平衡性能与代码变更同步)。
使用内存缓存减少数据库/文件访问
对于频繁访问的数据库查询结果、会话数据或计算结果,使用内存缓存(如Redis、Memcached)存储,避免重复读取磁盘。安装Redis及扩展:sudo apt install redis-server php-redis;配置PHP连接Redis(php.ini添加extension=redis.so),代码示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'hot_data';
if ($cached = $redis->get($cacheKey)) {
echo "Using cached data...";
} else {
$cached = fetchDataFromDB(); // 从数据库获取数据
$redis->set($cacheKey, $cached, 3600); // 缓存1小时
}
同样适用于会话存储(php.ini设置session.save_handler=redis)。
调整PHP-FPM进程池配置
合理设置PHP-FPM进程池参数,避免过多进程同时运行导致磁盘I/O竞争。编辑/etc/php/8.x/fpm/pool.d/www.conf:pm = dynamic(动态进程管理模式)、pm.max_children(根据服务器内存调整,如4GB内存可设为50,避免内存溢出)、pm.start_servers(启动时的进程数,设为max_children的1/4,如12)、pm.min_spare_servers(最小空闲进程数,如5)、pm.max_spare_servers(最大空闲进程数,如20)、pm.max_requests(每个进程处理的最大请求数,如500,避免内存泄漏)。
升级到最新稳定PHP版本
新版本PHP通常包含性能改进(如JIT编译器、OPcache优化),能提升脚本执行效率,减少磁盘I/O需求。Ubuntu 22.04+可通过ondrej/php PPA安装最新版本:sudo add-apt-repository ppa:ondrej/php,然后sudo apt update && sudo apt install php8.3 php8.3-fpm(以PHP 8.3为例)。
使用更快的存储设备
将PHP代码、日志、缓存目录放在SSD(尤其是NVMe SSD)上,相比传统HDD,SSD的随机读写速度更快,能显著降低磁盘I/O延迟。例如,将Web根目录/var/www/html迁移到SSD:sudo mv /var/www/html /mnt/ssd/html,然后创建符号链接:sudo ln -s /mnt/ssd/html /var/www/html。
监控磁盘I/O定位瓶颈
使用工具实时监控磁盘I/O,识别高负载进程:
sudo apt install iotop && sudo iotop -oPa,-o仅显示活跃I/O进程,-P显示进程ID,-a累计模式);sudo apt install sysstat && iostat -xz 1,%util接近100%表示磁盘饱和,await高表示I/O延迟高);vmstat 1,bi/bo分别表示每秒从磁盘读取/写入的块数,wa表示CPU等待I/O的时间占比,wa>20%可能存在I/O瓶颈)。