优化PHP配置文件(php.ini)
调整php.ini是基础且关键的内存优化手段,需根据应用需求合理设置核心参数:
memory_limit = 128M),避免脚本过度消耗内存。需平衡应用需求与服务器资源,避免设置过高导致内存浪费。opcache.enable=1),将PHP脚本编译后的字节码缓存起来,减少重复解析的开销。配合opcache.memory_consumption(如128MB)设置缓存内存大小,opcache.max_accelerated_files(如4000)设置缓存的文件数量,显著提升脚本执行效率。xdebug(zend_extension=/path/to/xdebug.so),仅在调试时开启,日常运行中禁用以减少内存占用。调整PHP-FPM进程池配置
若使用PHP-FPM(推荐),需合理配置进程池参数,避免进程过多导致内存耗尽:
dynamic(动态调整)或ondemand(按需启动)。static(固定进程数)虽响应快,但内存占用更稳定,适合负载波动小的场景。服务器内存/单个进程内存,假设单个进程100MB,服务器8GB内存则设置为80左右),避免过多进程导致内存溢出。dynamic模式下,start_servers(启动时进程数)设为pm.max_children的1/4~1/2(如20~40),min_spare_servers(最小空闲进程数)和max_spare_servers(最大空闲进程数)分别设为start_servers的1/2和1倍(如10~20),保持进程数动态平衡。pm.max_requests = 500),避免长期运行导致内存泄漏积累,定期重启进程释放内存。代码层面优化
从代码设计入手,减少内存占用:
unset()函数释放不再使用的变量、对象或数据库连接(如unset($result)、$db->close()),避免内存泄漏。yield),避免一次性加载全部数据到内存(如$stmt->fetch(PDO::FETCH_ASSOC)逐行读取)。$temp = $value * 2移至循环外),使用for循环替代foreach(for循环性能更优,内存占用更低)。WeakReference类打破引用链,允许垃圾回收器回收对象。使用缓存系统
引入缓存减少重复计算和数据库查询:
$redis->set('key', $data)),下次访问时直接从缓存读取,降低数据库负载和内存消耗。监控与调优
持续监控内存使用,及时调整配置:
top、htop实时查看PHP-FPM进程内存占用,free查看系统内存使用情况,vmstat监控虚拟内存统计信息。php-fpm status(需开启pm.status_path)查看进程池状态(如活跃进程数、空闲进程数),分析内存使用趋势。/var/log/php-fpm/error.log和/var/log/php-fpm/www-error.log,查找内存泄漏或异常(如Allowed memory size exhausted错误)。