Laravel Octane搭配FrankenPHP运行数小时后因状态码139崩溃
Laravel Octane运行数小时后触发段错误(状态码139)无日志排查方案
问题概述
Laravel Octane(基于FrankenPHP服务器)以systemd服务运行,应用稳定运行数小时后突然崩溃,进程退出状态码为139(对应SIGSEGV段错误),无应用层错误日志输出,系统日志仅记录进程退出信息,常规排查手段无法定位根因。
已尝试操作
- 检查系统日志,未发现内存/CPU异常飙升
- 配置Laravel自定义错误日志,无相关错误记录
- 多次重启Octane并清除缓存,问题依旧复现
- 监控运行环境,未发现明显内存泄漏或资源耗尽
补充信息
systemd服务配置
[Unit] Description=Laravel Octane After=network.target [Service] User=leensite Group=leensite WorkingDirectory=/home/leensite/domains/api.deleensite.nl/ ExecStart=/usr/local/php83/bin/php /home/leensite/domains/api.deleensite.nl/artisan octane:start --server=frankenphp --admin-port=8017 --watch Restart=always RestartSec=5 StandardOutput=syslog StandardError=syslog SyslogIdentifier=laravel-octane [Install] WantedBy=multi-user.target
系统日志片段
-- Logs begin at Sat 2024-10-19 00:36:59 CEST. -- okt 21 12:47:08 diana..com laravel-octane[3179888]: Press Ctrl+C to stop the server okt 21 15:37:41 diana..com systemd[1]: Stopping Laravel Octane... okt 21 15:37:41 diana..com systemd[1]: laravel-octane-leensite.service: Succeeded. okt 21 15:37:41 diana..com systemd[1]: Stopped Laravel Octane. okt 21 15:37:49 diana..com systemd[1]: Started Laravel Octane. okt 21 15:37:50 diana..com laravel-octane[3332275]: INFO Server running…. okt 21 15:37:50 diana..com laravel-octane[3332275]: Local: http://127.0.0.1:3015 okt 21 15:37:50 diana..com laravel-octane[3332275]: Press Ctrl+C to stop the server okt 22 12:52:32 diana..com systemd[1]: laravel-octane-leensite.service: Main process exited, code=exited, status=139/n/a okt 22 12:52:32 diana..com systemd[1]: laravel-octane-leensite.service: Failed with result 'exit-code'.
排查与解决步骤
段错误(SIGSEGV)通常由PHP扩展、底层服务器或PHP本身的内存访问错误导致,以下是针对性排查手段:
启用核心转储定位崩溃点
生成核心转储文件用于分析崩溃原因:- 修改systemd服务配置,在
[Service]段添加LimitCORE=infinity,重载配置后重启服务 - 崩溃后在工作目录或系统核心转储路径找到
core.<PID>文件,使用gdb /usr/local/php83/bin/php core.<PID>加载,执行bt命令查看调用栈,定位崩溃的具体模块
- 修改systemd服务配置,在
排查第三方PHP扩展
段错误多与不兼容或有bug的PHP扩展相关:- 临时禁用非必要扩展(如Redis、GD、Imagick等),重启Octane观察问题是否复现
- 确保所有扩展版本与PHP 8.3兼容,更新至最新稳定版
- 测试环境可使用
valgrind --leak-check=full /usr/local/php83/bin/php artisan octane:start ...检测内存泄漏(注意:valgrind会大幅降低性能,仅用于测试)
调整FrankenPHP与Octane配置
- 生产环境禁用
--watch参数,文件监控可能引发长期运行的内存问题 - 通过
--workers参数调整进程数,避免过多进程导致内存竞争 - 更新FrankenPHP到最新版本,修复已知的内存访问类bug
- 生产环境禁用
系统层面排查
- 运行
memtest86+检测内存硬件是否存在故障 - 升级系统内核至最新稳定版,修复旧内核的内存管理bug
- 检查OOM Killer日志:
dmesg | grep -i oom,确认是否因内存耗尽被系统杀死(状态码139有时关联OOM,但通常会有日志记录)
- 运行
Laravel应用层面排查
- 检查代码中是否存在静态变量未重置、全局状态污染等问题,Octane复用进程会放大此类问题
- 在
config/octane.php中开启log_requests,记录所有请求,定位崩溃前的最后请求 - 使用Laravel Telescope监控请求的资源使用与异常情况,排查潜在问题
内容的提问来源于stack exchange,提问作者Lumar
相关产品推荐
相关产品推荐

