参考资料

  1. Swoole 6.2.2 扩展正在为 PHP 8.3 编译的过程
  2. 报错很明确:8000 端口已被占用。先排查是谁占用了,再决定是杀掉还是换端口。
  3. Fresns 社区中用于解决 502 Bad Gateway 错误
  4. 针对 Fresns 的 PHP-FPM 调优
  5. Fresns 的队列配置核心是在 .env 文件中将 QUEUE_CONNECTION
  6. Laravel Octane 与 Swoole 扩展的版本不兼容
  7. Trying to access array offset on null 是 PHP 8.0+ 的警告
  8. Fresns 基于 Swoole 的运行状态输出

网站引擎 API 地址配置有问题

这两个错误日志揭示了同一个根因:Laravel 的日志系统配置不完整,而更深层的问题是 Guzzle HTTP 客户端在 PHP 8.3 下因废弃警告触发了日志系统的崩溃。

🚨 错误链路还原

  1. 触发点:网站引擎(Website Engine)通过 Guzzle 向 Fresns 主程序 API 发起请求,传递了 X-Fresns-Client-Platform-Id 这个 Header,但它的值是一个整数(int)而非字符串。

  2. PHP 8.3 的严格检查:Guzzle 7.11 在 PHP 8.3 下检测到这种类型不符合规范,触发了一个 Deprecation Warning(废弃警告)。

  3. Laravel 的日志机制:Laravel 会尝试将这个废弃警告写入名为 deprecations 的日志通道。

  4. 配置缺失导致崩溃:你的 config/logging.php 中没有定义 deprecations 这个通道,Laravel 找不到它,于是抛出 InvalidArgumentException: Log [deprecations] is not defined,导致日志系统降级到紧急模式。

  5. 连锁反应:日志系统崩溃后,原本的 Guzzle 警告无法被正常记录,最终导致 HttpHelper 在处理 API 响应时拿到了异常数据(null),引发了第一个文件中看到的 Trying to access array offset on null 错误。

🛠️ 解决方案

第一步:修复日志配置(解决 EMERGENCY 错误)

编辑 Fresns 根目录下的 config/logging.php 文件,在 channels 数组中添加一个 deprecations 通道:

'channels' => [
    // ... 其他通道保留不动
    'deprecations' => [
        'driver' => 'single',
        'path' => storage_path('logs/deprecations.log'),
        'level' => 'debug',
    ],
],

第二步:彻底关闭该通道的日志写入(可选,更彻底)

如果你不想记录这些废弃警告,可以在 .env 文件中设置:

LOG_DEPRECATIONS_CHANNEL=null

第三步:清理配置缓存(关键!)

修改配置后,必须删除配置缓存,否则修改不会生效:

rm -f bootstrap/cache/config.php
php artisan config:clear

第四步:重启 Octane 服务

由于你在使用 Octane(Swoole),修改配置后必须重启 Octane 进程才能加载新配置。

💡 针对“数组偏移 on null”的额外提示

完成上述日志修复后,API 请求应该能正常返回数据,第一个错误大概率会随之消失。如果 Trying to access array offset on null 仍然出现,说明你的 网站引擎 API 地址配置有问题,请检查:

  1. 网站引擎是否配置为 “本地(Local)” 模式,并指向当前主程序 API。

  2. 在 Fresns 后台 客户端 → 应用密钥 中,为网站引擎生成并配置了正确的 API Key。

完成这些步骤后,建议重启 PHP 和 Octane 进程,再访问帖子详情页验证问题是否解决。

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