php进程内存溢出主因是memory_limit设置超过系统可用内存,需按单核可用内存1/4设定;/tmp与session路径共用磁盘易致io瓶颈;php-fpm的request_terminate_timeout优先于max_execution_time;ssl续期失败常因disable_functions禁用exec等函数或systemd timer未启用。

PHP 进程吃光内存?先看 memory_limit 和实际可用 RAM 是否匹配
云服务器上 PHP 突然 500 或被 OOM Killer 杀掉,八成不是代码问题,而是 memory_limit 设得比系统剩余内存还高。比如你配了 2GB 内存的机器,php.ini 里设 memory_limit = 512M,看似合理,但 PHP-FPM 每个 worker 都会单独占用这份内存,10 个子进程就可能撑爆系统。
- 查真实可用内存:
free -h看available列,不是total -
memory_limit建议 ≤ 单核 CPU 对应可用内存的 1/4(如 2GB 可用 → 不超 512M) - 别信“PHP 启动慢=要加内存”,更可能是
opcache.enable_cli=1这类配置误开,导致 CLI 模式也加载 OPcache - 用
ps aux --sort=-%mem | head -10实时看哪个 PHP 进程真正在吃内存
磁盘 IO 成瓶颈?/tmp 和 session.save_path 别都挤在系统盘
小配置云服务器(比如 1 核 2GB + 40GB SSD)跑 WordPress 或 Laravel,上传文件慢、登录卡顿,大概率是 /tmp 和 PHP session 共用一块盘,大量小文件读写把 IOPS 打满。
- 检查当前 session 路径:
php -i | grep session.save_path,默认常是/tmp - 新建独立目录挂载:比如用云平台提供的高效云盘,挂到
/var/lib/php-sessions,再改session.save_path = "/var/lib/php-sessions" - 确保目录权限正确:
chown www-data:www-data /var/lib/php-sessions(Debian/Ubuntu)或chown nginx:nginx(CentOS) - 避免用
tmpfs挂/tmp:内存不够时会触发 swap,反而更慢
为什么 max_execution_time 改了没用?PHP-FPM 的 request_terminate_timeout 才是关键
你在 php.ini 把 max_execution_time = 300 改成 600,但脚本还是 30 秒就断——因为 PHP-FPM 层有独立超时控制,优先级更高,且默认值往往更短。
- 查 FPM 超时设置:
grep "request_terminate_timeout" /etc/php/*/fpm/pool.d/www.conf - 它和
php.ini的max_execution_time是两套机制:max_execution_time控制单个脚本内耗时,request_terminate_timeout控制整个 HTTP 请求生命周期(含网络等待) - 生产环境慎设为 0(不限时),容易堆积僵尸进程;建议设为
request_terminate_timeout = 120,再配合 Nginx 的fastcgi_read_timeout 120 - CLI 模式不受 FPM 配置影响,只认
max_execution_time
SSL 证书自动续期失败?别只盯 certbot,检查 systemd 定时器和 PHP 的 disable_functions
Let’s Encrypt 续期脚本跑在 crontab 里,但 PHP 脚本调用 exec('certbot renew') 却返回空,日志里只有 Warning: exec() has been disabled for security reasons —— 这是典型配置遗漏。
- 检查禁用函数:
php -i | grep disable_functions,常见被禁的有exec、shell_exec、system - 如果必须调用外部命令,不要全局放开,改用
proc_open()+ 白名单路径(如只允许执行/usr/bin/certbot) - 确认 systemd timer 是否启用:
systemctl list-timers | grep certbot,很多镜像默认不启动certbot.timer - PHP-FPM 子进程的环境变量可能不继承 root 的 PATH,续期脚本里写绝对路径:
/usr/bin/certbot renew --quiet --post-hook "/usr/sbin/nginx -s reload"
session.save_path 权限错,可能表现为登录态丢失;一个 disable_functions 少列了个 putenv,就能让 Composer 安装中途报错。细节不在文档里,在 ps、strace 和反复 grep 的日志中。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











