这个坑值得记一笔。CentOS 7.9 上 PHP 8.0,opcache.memory_consumption 是 128M,发布新版本后部分页面偶发白屏,error_log 里出现 restart scheduled 和 Failed to allocate shared memory,重启 FPM 只能好一阵。

刚开始盯着「缓存满了会整块重启,重启瞬间所有请求都要重新编译,白屏就出现在这一刻」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。项目用了 composer,vendor 目录几万个文件,128M 的共享内存装不下;max_accelerated_files 上限偏低,超出部分干脆不进缓存;exclude 规则没排除测试目录和缓存目录,无效文件占了不少空间。

动手时先看共享内存到底用了多少

php -r 'var_dump(opcache_get_status(false)["memory_usage"]);'

随后核对容量和文件数上限

grep -E '^opcache\.(memory_consumption|max_accelerated_files)' /etc/php.ini

然后按项目体量把两处上限都提上去

sed -i 's/^opcache.memory_consumption.*/opcache.memory_consumption=512/; s/^opcache.max_accelerated_files.*/opcache.max_accelerated_files=20000/' /etc/php/8.0/fpm/php.ini && systemctl reload php8.0-fpm

剩下的就是确认重启计数有没有再涨

php -r 'var_dump(opcache_get_status(false)["opcache_statistics"]["oom_restarts"]);'

别只看报错消失,验证要多做一步。memory_usage 的 free 保持在 100M 以上,oom_restarts 与 hash_restarts 不再增长,页面白屏消失,接口耗时曲线平直。

共享内存是整机共享的,多站点同一台机器要把容量按站点数加起来算,别按单站需求量给。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189