要让PHP进程崩溃时生成core dump文件,关键在于配置Linux系统级限制(ulimit -c unlimited、/etc/security/limits.conf)、设置kernel.core_pattern指定路径与命名规则、确保目录可写,并在php-fpm中配置rlimit_core = unlimited,最后用gdb分析core文件定位C层崩溃点。

要让 PHP 进程在崩溃时生成 core dump 文件,关键不是改 PHP 本身,而是确保底层 Linux 系统允许、PHP 进程有权限、且路径可写。核心转储由内核触发,PHP 只是普通用户进程,必须满足系统级条件才能落地 core 文件。
确认并放开系统级限制
Linux 默认禁用 core dump,需主动解除限制:
- 运行 ulimit -c 查看当前限制,若输出为 0,说明被禁用
- 执行 ulimit -c unlimited 启用(仅当前 shell 有效)
- 如需永久生效,将 ulimit -c unlimited 加入 ~/.bashrc(CLI 场景)或配置 /etc/security/limits.conf(如
www-data soft core unlimited) - 注意硬限制(ulimit -H -c),若为 0,需先在 limits.conf 中同时设 hard limit
指定 core 文件存放位置与命名规则
避免 core 文件被丢弃或覆盖,需明确路径和格式:
- 以 root 身份执行:echo "/data/coredump/core-%e.%p" > /proc/sys/kernel/core_pattern
- 其中 %e 是程序名(如 php-fpm),%p 是 PID,保证唯一性
- 提前创建目录并赋权:mkdir -p /data/coredump && chmod 777 /data/coredump(确保 PHP 进程用户可写)
- 也可写入 /etc/sysctl.conf 持久化:
kernel.core_pattern=/data/coredump/core-%e.%p,再运行 sysctl -p
调整 PHP 进程自身的资源限制
对于 php-fpm,还需在其配置中显式放开 rlimit:
立即学习“PHP免费学习笔记(深入)”;
- 编辑 php-fpm.conf 或 pool 配置文件(如
www.conf) - 设置:rlimit_core = unlimited(旧版可能写作
rlimit_core = 0,0 在此语境表示不限制) - 重启 php-fpm:sudo systemctl restart php-fpm 或 kill -USR2 $(cat /var/run/php-fpm.pid)
- 若用 Apache mod_php,需确保 httpd 进程也满足 ulimit 和 core_pattern 条件
验证与调试 core 文件
生成后需确认内容可用,不能只看文件是否存在:
- 用 file core-* 检查是否为合法 ELF core 文件
- 用 gdb /usr/sbin/php-fpm core-xxx(路径替换成你实际的 php-fpm 二进制)
- 进入 gdb 后输入 bt 查看完整调用栈,定位到 C 层崩溃点(如 memcached 扩展、curl、gd 等)
- 若回溯中出现
php_memc_destroy或zif_curl_setopt等,说明问题出在对应扩展



















