确保PHP版本为最新稳定版(如PHP 8.x),因为新版本通常修复了已知的内存泄漏bug。同时,升级PHP扩展(如MySQLi、PDO、GD等)至与PHP版本兼容的最新版,避免扩展导致的内存泄漏。
使用专业工具定位泄漏代码:
xdebug.memory_usage=On),生成内存分配报告,识别未释放的内存块;top -o %MEM或ps aux --sort=-%mem | head -n 10找出占用内存高的php-fpm进程,再用pmap -x <PID>分析进程内存映射,定位占用内存的模块。unset()函数及时清除不再使用的变量(如大数组、数据库查询结果);ObjectA引用ObjectB,ObjectB引用ObjectA),使用弱引用(WeakReference)或重构代码,避免垃圾回收器无法回收;mysqli_connect)使用非持久化模式(p:前缀),避免连接池积累导致内存泄漏;$output[] = $item),改用引用传递或批量处理。php.ini中的memory_limit(如memory_limit = 256M),但需根据服务器内存合理设置,避免过度分配;zend.enable_gc = On,并调整垃圾回收阈值(gc_threshold),定期清理循环引用的对象;php-fpm.conf中设置pm.max_children(子进程数量)、pm.start_servers(启动进程数),避免过多进程消耗内存。systemctl restart php-fpm),但需结合代码修复彻底解决问题;systemd配置(/etc/systemd/system/php-fpm.service)添加MemoryLimit=512M,限制单个php-fpm进程的最大内存使用;或使用ulimit -v 524288(512MB)限制进程虚拟内存;pmap检测内存超过阈值则重启php-fpm),加入crontab每小时执行一次,防止内存泄漏拖垮系统。ab(Apache Benchmark)或jmeter模拟高并发场景,提前发现内存泄漏问题;