octane 启动失败主因是 swoole 扩展未安装或版本低于4.8.0(须编译安装);队列需用 queue:work 配合 supervisor;nginx 必须用 proxy_pass 并调优超时;本地开发推荐 roadrunner,生产环境首选 swoole。

Octane 启动失败报 Swoole\Server 类不存在
根本原因是 Swoole 扩展没装,或版本不兼容。Laravel Octane 要求 Swoole ≥ 4.8.0,且必须是编译安装(PECL 或源码),不能靠 apt install php-swoole 这类包管理器——Ubuntu/Debian 的仓库版通常太旧,连 Swoole\Server 都没导出。
- 运行
php -m | grep swoole确认扩展已加载;没输出就先装:用pecl install swoole(PHP 8.1+ 推荐加-v 5.0.3指定版本) - 检查
php --ri swoole输出里的version,低于 4.8.0 就得升级 - 如果用了 Docker,确保基础镜像含 Swoole(比如
laravelsail/php81-composer不带,得自己pecl install) -
php artisan octane:start --server=swoole启动前,务必确认SWOOLE_PROCESS常量存在(Swoole ≥ 4.8 默认启用,但某些精简版可能关了)
响应变快了,但队列任务卡住不动
Octane 默认把整个 Laravel 应用常驻内存,而 Laravel 的队列监听器(php artisan queue:listen)本身也是长生命周期进程,两者共存会抢资源、冲突信号,尤其在 swoole 模式下,队列进程容易被主服务“吸走”事件循环,彻底失活。
- 绝对不要在 Octane 进程里直接跑
queue:listen;改用queue:work --daemon已废弃,必须用queue:work(无--daemon)配合进程管理器(如 Supervisor)单独拉起 - 数据库连接要设短生命周期:在
config/database.php的mysql配置里加'options' => [PDO::ATTR_TIMEOUT => 5],否则连接池空闲太久会被 Swoole 强制回收,后续请求抛PDOException: SQLSTATE[HY000] [2002] Connection refused - Redis 连接同理,
config/database.php中redis配置需加'persistent' => false,避免连接复用导致超时堆积
php artisan octane:start 启动后请求 502 或超时
常见于 Nginx 反向代理配置没适配 Swoole 的长连接特性。Octane 默认监听 127.0.0.1:8000,但 Nginx 若仍按 PHP-FPM 模式配 fastcgi_pass,就会 502;若用了 proxy_pass 却没调超时,请求稍长就直接断。
- Nginx 配置必须用
proxy_pass http://127.0.0.1:8000,不是fastcgi_pass - 在
location /块里补这三行:proxy_http_version 1.1;、proxy_set_header Connection '';、proxy_read_timeout 60;(默认 60 秒,大文件上传可调高) - Octane 默认开启 HTTPS 重定向,但若前端有 CDN 或 LB,
X-Forwarded-Proto头没传,会导致无限跳转;在AppServiceProvider的boot()里加URL::forceScheme('https')要慎用,优先让负载均衡器传头
本地开发用 swoole 还是 roadrunner?
本地开发选 roadrunner 更稳。Swoole 在 macOS 上依赖 brew install swoole,但 Apple Silicon(M1/M2)的 PECL 编译经常链错 libphp,报 undefined symbol: _zval_ptr_dtor;而 RoadRunner 是 Go 二进制,跨平台一致,启动快,调试友好。
- 本地跑
php artisan octane:start --server=roadrunner,它会自动下载对应版本的rr二进制到vendor/bin/rr - 但生产环境强烈建议用
swoole:RoadRunner 的 HTTP worker 进程模型不如 Swoole 的协程轻量,高并发下内存占用高约 20%–30% - 二者日志路径不同:Swoole 日志默认写
storage/logs/octane.log,RoadRunner 的日志在rr.log(同级目录),别漏监控
async 的 Guzzle HTTP 请求,或没设 timeout 的 Redis get,在传统 FPM 下只是慢一点,在 Octane 下可能直接拖垮整个 worker 进程。真正见效的前提,是先理清你应用里哪些 IO 操作还在傻等。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











