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
相关产品推荐
相关产品推荐

