如何调整XAMPP中PHP的垃圾回收策略设置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计764个文字,预计阅读时间需要4分钟。
Examining the provided content, here's a simplified rewrite:
EXAMPMP is set to default with PHP and garbage collection mechanisms, inheriting PHP's default behavior during compilation (as shown in the code `zend.enable_gc=1`). However, you can adjust several key parameters in the `php.ini` file to practically modify GC's development strategies.
确认当前 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
这是真正控制垃圾回收器是否加载的布尔开关,和上面两个参数正交:
立即学习“PHP免费学习笔记(深入)”;
- 设为
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 自带的——调试时务必分清上下文。
本文共计764个文字,预计阅读时间需要4分钟。
Examining the provided content, here's a simplified rewrite:
EXAMPMP is set to default with PHP and garbage collection mechanisms, inheriting PHP's default behavior during compilation (as shown in the code `zend.enable_gc=1`). However, you can adjust several key parameters in the `php.ini` file to practically modify GC's development strategies.
确认当前 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
这是真正控制垃圾回收器是否加载的布尔开关,和上面两个参数正交:
立即学习“PHP免费学习笔记(深入)”;
- 设为
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 自带的——调试时务必分清上下文。

