1. 调整PHP配置文件(php.ini)
修改php.ini是优化PHP内存使用的基础。关键参数包括:
memory_limit:设置单个PHP脚本的最大内存使用量(如memory_limit = 128M),根据应用需求调整(避免设置过高导致内存浪费)。opcache.enable=1(启用)、opcache.memory_consumption=128(缓存内存大小,单位MB)、opcache.interned_strings_buffer=8(interned字符串缓冲区大小)、opcache.max_accelerated_files=4000(最大加速文件数,根据项目文件数量调整)。memory_limit设为64M,大型应用设为256M。2. 优化PHP代码逻辑
代码层面的优化能直接减少内存占用:
unset()函数销毁不再需要的变量(如大数组、数据库连接对象),释放内存。例如:$largeArray = range(1, 1000000); unset($largeArray);。yield)以迭代方式处理数据,避免一次性加载全部数据到内存(如处理大型CSV文件时,用yield逐行读取)。for ($i = 0; $i < count($array); $i++)改为$count = count($array); for ($i = 0; $i < $count; $i++)),减少内存分配次数。3. 启用并配置OPcache
OPcache是PHP官方推荐的字节码缓存扩展,能显著减少内存使用:
sudo apt install php-opcache安装,然后在php.ini中添加zend_extension=opcache.so并启用(opcache.enable=1)。opcache.memory_consumption(如128M),设置opcache.max_accelerated_files为项目中PHP文件的总数(可通过find /path/to/project -name "*.php" | wc -l统计),避免缓存过多无用文件。4. 使用外部缓存系统
对于频繁访问但不常变化的数据(如数据库查询结果、会话数据),使用Redis或Memcached等外部缓存系统,减少PHP脚本的内存占用:
sudo apt install redis-server)和PHP Redis扩展(sudo apt install php-redis),在代码中连接Redis并存储数据:$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$data = $redis->get('cached_data'); // 尝试从缓存获取
if (!$data) {
$data = fetchDataFromDatabase(); // 若缓存无数据,从数据库获取
$redis->set('cached_data', $data, 3600); // 存入缓存,有效期1小时
}
这样可避免每次请求都从数据库加载大量数据,降低PHP内存压力。5. 调整PHP-FPM配置(若使用FPM)
PHP-FPM(FastCGI进程管理器)的配置直接影响内存使用:
/etc/php/{version}/fpm/pool.d/www.conf({version}为PHP版本,如8.1),优化以下参数:
pm.max_children:设置最大子进程数(如pm.max_children = 20),根据服务器内存计算(每个子进程约占用memory_limit的1/4至1/2,如memory_limit=128M,则pm.max_children不宜超过50)。pm.start_servers:启动时的子进程数(如pm.start_servers = 5)。pm.min_spare_servers/pm.max_spare_servers:空闲子进程的最小/最大数量(如pm.min_spare_servers = 5,pm.max_spare_servers = 10)。6. 监控与分析内存使用
通过工具监控内存使用,定位瓶颈:
memory_get_usage()(当前内存使用量)和memory_get_peak_usage()(峰值内存使用量)输出到日志,分析脚本内存消耗情况。sudo apt install php-xdebug),在php.ini中启用内存分析(xdebug.profiler_enable=1,xdebug.profiler_output_dir=/tmp),生成内存使用报告,识别高内存消耗的代码段。7. 修复内存泄漏
内存泄漏会导致内存持续增长,需通过以下方式修复:
WeakReference)打破循环引用(如对象A引用对象B,对象B引用对象A),避免垃圾回收器无法回收。$db = null、fclose($file))。gc_collect_cycles()强制进行垃圾回收,释放未使用的内存(如循环结束后调用)。__destruct())中释放资源(如关闭数据库连接),确保资源被正确回收。8. 系统级优化
sudo fallocate -l 2G /swapfile,sudo chmod 600 /swapfile,sudo mkswap /swapfile,sudo swapon /swapfile),缓解物理内存压力,但需注意Swap会降低性能,仅作为临时解决方案。sudo systemctl restart php{version}-fpm)或Apache(sudo systemctl restart apache2),释放累积的内存碎片。