参考资料

  1. Octane 的 Worker 进程未能正确初始化,导致处理请求的核心对象是空的,而这个异常又被外层的登录或安全拦截机制捕获,显示成了登录页
  2. Fresns 的 Swoole 配置
  3. 报错很明确:8000 端口已被占用。先排查是谁占用了,再决定是杀掉还是换端口。
  4. Laravel Octane 与 Swoole 扩展的版本不兼容
  5. Swoole 6.2.2 扩展正在为 PHP 8.3 编译的过程
  6. Fresns 社区中用于解决 502 Bad Gateway 错误
  7. Trying to access array offset on null 是 PHP 8.0+ 的警告
  8. 占用 8000 的正是你之前启动的 octane 进程

php --ri swoole 的输出可以看到

编译成功了!🎉

从 php --ri swoole 的输出可以看到:

关键成功标志

项目值说明
Swoole => enabled✅扩展已加载
Version => 6.2.2✅版本正确
Built => Oct 2 2026 09:12:20✅编译时间,就是刚才那次编译
coroutine => enabled with boost asm context✅协程已启用
openssl => OpenSSL 3.0.13✅SSL 支持正常
http2 => enabled✅HTTP/2 支持
json => enabled✅JSON 支持
zlib => 1.3✅压缩支持

几点说明

  1. 编译完全成功,之前日志里看到的 g++ ... worker.cc、reactor_thread.cc 等一系列编译命令最终都链接成功了,生成了 swoole.so 并被 PHP 8.3 正确加载。

  2. boost asm context 是 Swoole 6.x 默认使用的协程上下文切换实现(汇编级别,性能好),说明编译时检测到了可用的 asm 上下文支持,这是正常的。

  3. brotli => E16781312/D16781312 显示的是一个编译期常量(brotli 版本号),不是错误,说明 brotli 压缩也编进去了。

  4. 所有 directive 都是默认值,没有异常配置。

  5. swoole.use_shortname => On 表示可以使用 Swoole\Coroutine 的短别名(如 Co\run()),如果你想禁用短别名可以改 php.ini。

下一步建议

现在 Swoole 已经装好了,你可以:

  1. 验证协程是否可用:

    php -r 'Co\run(function(){ echo "coroutine works\n"; });'
  2. 如果你在用 Fresns(从你的路径 /www/wwwroot/www.madama.cn/fresns 看像是),确保 Fresns 的 Swoole 相关配置正确,比如队列、WebSocket 等。

  3. 检查 php.ini 是否持久化了 extension,避免重启 PHP 后丢失:

    php --ini | grep swoole

    确认 swoole.so 已经写入某个 php.ini 里。

  4. 重启 PHP-FPM(如果还没重启)让配置生效:

    /etc/init.d/php-fpm-83 restart
    # 或宝塔面板里重启 PHP 8.3

需要我帮你看 Fresns 的 Swoole 配置,或者测试协程功能吗?

作者:王壹杰
时间:2026-10-02 09:47:45
来源:https://fresns.ciilii.com/