CentOS 7.9 的机器升到八 G 内存,PHP 处理大文件时仍然报 Allowed memory size exhausted,php -i 里 Architecture 显示的是 32 位。

原因不止一个,得分开看。32 位进程的虚拟地址空间上限就是四 G,用户态只能用三 G 左右;安装的是 i686 的 PHP 包,跟着 32 位系统一起装进来的;memory_limit 设到 -1 也没用,地址空间先耗尽了;扩展里有一块固定的映射区,把可用空间进一步压小。

第一件事是确认 PHP 的架构

php -i | grep -E 'Architecture|memory_limit'

再往下看系统里是否有 64 位的 PHP 可用

rpm -qa | grep php | head && uname -m

随后换成 64 位源重新安装

yum install -y php74-php-cli.x86_64

调整 memory_limit 后再跑一次

php -d memory_limit=2G -r 'echo ini_get("memory_limit"),PHP_EOL;'

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

别只看报错消失,验证要多做一步。php -i 里 Architecture 变成 x86_64,同样的大文件处理脚本在 2G 限制内正常跑完,不再报内存耗尽。

提醒一点。32 位进程的内存天花板是地址空间,不是物理内存,加内存条没用;老系统迁 64 位要连带重装所有扩展,别只换 PHP 本体。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189