You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Octane(Roadrunner)分页偶现Using $this when not in object context错误

Laravel Octane(Roadrunner)分页器偶发Using $this when not in object context错误

问题描述

服务器环境为Laravel Octane + Roadrunner,大部分功能正常,但使用分页器的页面偶尔抛出错误:

Using $this when not in object context

重启Octane服务器后问题暂时消失,但运行一段时间后会再次出现。已尝试清除缓存,无效。

错误截图:
分页器错误截图

相关控制器代码:

$news = News::filter($filters)
            ->with(['tags', 'categories', 'createdBy'])
            ->where('status', 1)
            ->orderByDesc('publish_date')
            ->paginate(10)
        ;
return view('admin.news.index', compact('news'));

可能的原因与解决方案

1. 分页视图的上下文错误

检查自定义的分页视图文件(如resources/views/vendor/pagination/*.blade.php),确认没有在非对象上下文的场景中使用$this。比如在闭包、静态调用片段中误用$this,在Octane常驻进程的状态积累下会触发该错误。

错误示例:

{{ $paginator->links(function ($element) {
    return $this->generateLink($element); // 此处$this不在对象上下文
}) }}

2. 自定义分页器的状态残留

如果使用了自定义分页器类,确保类中没有使用静态属性存储请求相关数据,或者在每次请求后重置实例状态。Octane的常驻进程会保留类的静态状态,导致跨请求的上下文污染。

3. 调整Octane进程配置

Roadrunner的工作进程在处理大量请求后,可能因全局状态污染引发错误。可以修改config/octane.php中的max_requests参数,降低每个进程处理的请求数,让进程自动重启清理状态:

'max_requests' => 100, // 从默认值(如1000)调小

同时,可利用Octane的请求后钩子清理自定义服务的状态:

// 在服务提供者的boot方法中添加
use Laravel\Octane\Facades\Octane;

Octane::afterRequest(function () {
    // 重置静态变量或清理服务状态
});

4. 模型作用域的静态存储问题

检查News模型的filter全局作用域,确保作用域中没有使用静态变量存储请求参数。静态变量会在常驻进程中保留跨请求的数据,导致查询逻辑混乱:

错误示例:

public function scopeFilter($query, $filters)
{
    static $storedFilters = [];
    $storedFilters = array_merge($storedFilters, $filters);
    // ...后续逻辑依赖$storedFilters
}

应改为每次请求都重新处理传入的$filters参数,不使用静态存储。


内容的提问来源于stack exchange,提问作者Sambhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:53:25