1. 调整PHP配置文件(php.ini)的核心参数
memory_limit = 128M
或256M
),需根据应用实际需求调整(避免过高导致内存浪费或过低导致脚本终止)。upload_max_filesize = 50M
、post_max_size = 50M
),避免因上传文件过大触发内存错误。max_execution_time = 300
),防止长时间运行的脚本(如大数据处理)被强制终止。2. 启用并优化OPcache加速
OPcache通过缓存PHP脚本的字节码,减少重复编译的开销,显著降低内存消耗。需安装扩展(sudo apt install php-opcache
)并在php.ini中配置:
[opcache] zend_extension=opcache.so opcache.enable=1 opcache.memory_consumption=128 # OPcache缓存大小(MB),根据服务器内存调整 opcache.interned_strings_buffer=8 # 内部字符串缓冲区大小(MB) opcache.max_accelerated_files=10000 # 最大加速文件数,需覆盖应用所有PHP文件 opcache.revalidate_freq=60 # 文件修改后重新验证的时间间隔(秒)
生产环境中建议关闭opcache.validate_timestamps
(设为0),避免频繁检查文件修改时间。
3. 优化PHP-FPM进程管理
若使用PHP-FPM(推荐),需调整进程池参数以合理分配内存:
编辑/etc/php/{version}/fpm/pool.d/www.conf
({version}为PHP版本,如8.2),重点设置:
pm.max_children = 50 # 最大子进程数,根据服务器内存计算(如1GB内存可设为20-30) pm.start_servers = 5 # 启动时的子进程数 pm.min_spare_servers = 5 # 最小空闲子进程数 pm.max_spare_servers = 35 # 最大空闲子进程数 pm.max_requests = 3000 # 每个子进程处理的最大请求数,防止内存泄漏积累
这些参数需平衡内存使用和并发性能,避免进程过多导致内存耗尽。
4. 代码层面优化内存使用
yield
替代一次性加载所有数据到内存,例如:function readLargeFile($file) { $handle = fopen($file, 'r'); while (!feof($handle)) { yield fgets($handle); } fclose($handle); }
unset()
释放内存(如unset($largeArray)
);关闭数据库连接(如$mysqli->close()
)。WeakReference
(PHP 7.4+)或手动断开引用。SplFixedArray
替代关联数组(如$array = new SplFixedArray(1000)
),减少内存占用(尤其适合存储大量数字索引数据)。5. 使用缓存减少重复计算
引入Redis或Memcached缓存频繁访问的数据(如数据库查询结果、页面片段),减少PHP脚本的执行次数和内存消耗。例如:
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $cachedData = $redis->get('key'); if (!$cachedData) { $cachedData = fetchDataFromDB(); // 从数据库获取数据 $redis->set('key', $cachedData, 3600); // 缓存1小时 }
缓存可显著降低数据库负载和PHP内存使用。
6. 监控与分析内存使用
top
、htop
查看系统内存使用情况;php-fpm status
(通过sudo systemctl status php{version}-fpm
)查看PHP-FPM进程的内存占用。memory_get_usage()
(当前内存使用量)和memory_get_peak_usage()
(峰值内存使用量)输出关键位置的内存使用情况;用Xdebug生成内存快照,分析内存泄漏点(如未释放的对象、循环引用)。7. 系统级优化
ulimit -n 65535
),避免高并发时因文件描述符不足导致内存分配失败。sudo fallocate -l 2G /swapfile # 创建2GB Swap文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
需将/swapfile
添加到/etc/fstab
以实现开机自动挂载。