1. 优化PHP-FPM进程池配置
进程池参数是控制PHP-FPM内存占用的核心,需根据服务器内存和业务负载调整:
dynamic(动态调整,适合大多数场景)或ondemand(按需启动,适合低流量场景);static(固定进程数,适合高并发但内存充足的服务器)资源占用更稳定,但灵活性差。pm.max_children需根据服务器内存计算(公式:(服务器总内存 - 系统预留内存) / 单个PHP进程内存,单个进程内存可通过ps -ylC php-fpm --sort:rss估算);pm.start_servers设为pm.max_children的1/4~1/2(如max_children=50,则start_servers=10~25);pm.min_spare_servers(最小空闲进程)和pm.max_spare_servers(最大空闲进程)分别设置为start_servers的1~2倍,避免频繁创建/销毁进程消耗内存。pm.max_requests设置每个子进程处理的最大请求数(如500~1000),达到阈值后自动重启进程,释放内存泄漏(如脚本未释放的全局变量)占用的内存。2. 严格限制单个PHP脚本内存使用
修改php.ini中的memory_limit参数,根据应用需求设置合理值(如普通CMS站点设为128M~256M,小型API设为64M~128M)。若部分脚本需要更大内存,可在脚本内通过ini_set('memory_limit', '256M')单独调整,但需避免滥用导致内存溢出。
3. 启用并优化OPcache字节码缓存
OPcache可缓存PHP脚本的字节码,避免重复编译,显著减少内存占用并提升性能:
sudo apt-get install php-opcache(Ubuntu/Debian)或通过php.ini加载扩展。opcache.enable=1(开启缓存);opcache.memory_consumption=128(缓存大小,根据内存调整,如1GB内存可设为128~256M);opcache.interned_strings_buffer=8(字符串驻留缓冲区,设为8~16M);opcache.max_accelerated_files=4000(加速文件数量,设为项目中PHP文件总数的1.5~2倍);opcache.revalidate_freq=60(缓存验证频率,设为60~300秒,平衡性能与代码更新)。4. 优化PHP代码减少内存消耗
SELECT *),使用生成器(yield)处理大数据集,减少内存占用。php.ini注释或移除未使用的扩展(如xdebug、gd(若不需要图片处理)),减少内存加载。5. 监控与持续调优
top(按M键按内存排序)、htop(更直观)查看PHP-FPM进程内存占用;php-fpm status(需开启pm.status_path)查看进程池状态(如活跃进程数、空闲进程数)。/var/log/php-fpm/error.log(错误日志)和/var/log/php-fpm/www-error.log(站点错误日志),查找内存泄漏或脚本错误线索。pm.max_requests,仍建议每周重启一次PHP-FPM(systemctl restart php-fpm),释放累积的内存碎片。