xampp默认启用php垃圾回收(zend.enable_gc=1),通过php.ini中gc_probability与gc_divisor控制触发频率,默认每100次请求触发一次;修改后需重启apache,并用phpinfo()确认配置路径及gc_enabled()验证生效。

XAMPP 默认不修改 PHP 垃圾回收机制,它直接继承 PHP 编译时的默认行为(zend.enable_gc=1),但你可以通过调整 php.ini 中的几个关键参数来实际改变 GC 的触发策略。
确认当前 XAMPP 使用的 php.ini 路径
很多人改错文件,结果重启 Apache 也无效。XAMPP 的 PHP 配置不是用系统级或用户级的 php.ini,而是用 XAMPP 自带的那份:
- Windows:通常在
XAMPP\php\php.ini(不是XAMPP\apache\bin\php.ini) - macOS/Linux:在
/Applications/XAMPP/xamppfiles/etc/php.ini或类似路径 - 务必用
phpinfo()页面里的Loaded Configuration File行确认真实路径
修改 gc_probability 和 gc_divisor 控制触发频率
这两个参数决定「每多少次请求触发一次 GC」,不是开关,而是概率采样机制。默认值是 gc_probability = 1、gc_divisor = 100,即平均每 100 次请求触发一次。
- 想更激进(适合内存敏感长脚本):
gc_probability = 100+gc_divisor = 1→ 每次请求都运行 GC - 想更保守(适合高并发短请求):
gc_probability = 0→ 彻底禁用自动 GC(但不推荐) - 注意:
gc_probability = 0不等于关闭 GC 算法,只是跳过自动采样;仍可通过gc_collect_cycles()手动触发
禁用或启用 GC 的底层开关 zend.enable_gc
这是真正控制垃圾回收器是否加载的布尔开关,和上面两个参数正交:
- 设为
zend.enable_gc = Off:PHP 启动时不初始化 GC 数据结构,gc_collect_cycles()会返回0,且无法再启用 - 设为
zend.enable_gc = On(默认):GC 子系统就绪,可响应自动/手动触发 - 修改后必须重启 Apache(不是仅 reload),否则不生效
验证修改是否生效
别只信配置文件,运行一段测试代码确认行为变化:
<?php var_dump(gc_enabled()); // 应返回 bool(true/false)
var_dump(ini_get('zend.enable_gc'));
var_dump(ini_get('gc_probability'));
var_dump(ini_get('gc_divisor'));
?>
再跑一个循环引用测试:
<?php $a = ['x' => 1]; $b = ['y' => 2]; $a['ref'] = &$b; $b['ref'] = &$a; unset($a, $b); echo memory_get_usage() . "\n"; gc_collect_cycles(); // 手动触发,看是否释放 echo memory_get_usage() . "\n"; ?>
如果 zend.enable_gc = Off,第二行内存几乎不会下降;如果 gc_probability=0 但 zend.enable_gc=On,手动调用仍有效。
最容易被忽略的是:XAMPP 多环境共存时(如同时装了多个版本 PHP),php -v 命令行用的可能是另一份 php.ini,而 Apache 用的是 XAMPP 自带的——调试时务必分清上下文。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











