参考资料

  1. 端口还是被占用,但 PID 变了(从 244xx 变成了 261xx)。
  2. Fresns 的队列配置核心是在 .env 文件中将 QUEUE_CONNECTION
  3. Fresns 的请求头采用 X-Fresns-* 命名格式,主要用于身份认证和客户端信息传递
  4. php --ri swoole 的输出可以看到
  5. Nginx 无法连接到 Octane 监听的端口
  6. Swoole 6.2.2 扩展正在为 PHP 8.3 编译的过程
  7. Fresns 的 Swoole 配置
  8. Trying to access array offset on null 是 PHP 8.0+ 的警告

Octane 的 Worker 进程未能正确初始化,导致处理请求的核心对象是空的,而这个异常又被外层的登录或安全拦截机制捕获,显示成了登录页

从你的输出来看,Swoole 版本(6.2.2)是完全满足要求的,所以问题不在扩展本身。

Call to a member function handle() on null 这个错误,结合你之前看到的“请使用正确的门户登录”提示,根源很可能在于:Octane 的 Worker 进程未能正确初始化,导致处理请求的核心对象是空的,而这个异常又被外层的登录或安全拦截机制捕获,显示成了登录页。

🎯 核心排查方向

1. 检查 Octane 进程是否真正启动成功
php artisan octane:start 命令可能显示“Server running”,但 Worker 在后台实际启动失败了。最直接的方法是手动在前台启动,观察完整的输出信息,看是否有报错:

php artisan octane:start --server=swoole --host=127.0.0.1 --port=8000 --workers=1 --task-workers=0

重点关注:命令行有没有抛出异常、警告,或者输出“Worker starting”后卡住、立即退出。

2. 验证 PHP CLI 与 FPM 的环境一致性
虽然你确认了 Swoole 扩展已安装,但 Octane 运行在 CLI 模式,和你访问网站时的 FPM 模式加载的配置、扩展可能不同。运行以下命令,确保 CLI 模式的 php.ini 路径和 Swoole 加载情况完全正确:

php --ini | grep "Loaded Configuration"
php -m | grep swoole

如果两者不一致,Octane 启动时可能因为依赖缺失而导致 Worker 初始化异常。

3. 检查 Nginx 代理配置
你的错误信息里夹杂了登录面板的内容,这说明 Nginx 可能没有把所有请求正确地转发给 Octane 的端口,或者 Octane 根本没有接管请求。请确认你的 Nginx 站点配置里,location 块使用的是 proxy_pass http://127.0.0.1:8000;,而不是 PHP-FPM 的 fastcgi_pass。如果 Octane 实际没在跑,代理请求会落到其他服务(比如面板的登录网关)上,从而返回一个登录页面。

💡 如果上述步骤无法解决,可以尝试这个临时方案

在 config/octane.php 配置文件中,尝试明确禁用 Swoole 的短名称函数,避免潜在的命名冲突(这个问题曾导致 Laravel 内部的 defer() 函数被 Swoole 覆盖):

// config/octane.php
'swoole' => [
    'options' => [
        'log_file' => storage_path('logs/swoole_http.log'),
    ],
],

然后,在 php.ini 中添加或确认 swoole.use_shortname = off,并重启 Octane 服务。

如果手动前台启动后依旧没有头绪,可以把 php artisan octane:start 的完整前台输出贴出来,我再帮你进一步分析。

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