如何在Laravel中检查当前应用程序进程是否在队列环境中运行

e0uiprwp  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(504)

我通过一个trait给我的模型应用了一个全局作用域,但是我不希望在Redis队列中调用/处理模型时应用全局作用域。
如何检测当前示例是否是队列进程?就像我们现在这样

if (App::environment('local')) {
    // The environment is local
}

以检测应用程序是在本地运行还是在生产环境中运行。

gajydyqb

gajydyqb1#

只需调用runningInConsole()方法:

if (app()->runningInConsole()) {

或使用the App facade

if (\App::runningInConsole()) {

以检查是否正在通过CLI执行。

11dmarpk

11dmarpk2#

我有两个解决方案,都在拉腊维尔9号工作。
"第一个"
如果应用程序在队列中运行,则Lavel在服务容器中注册\Illuminate\Queue\CallQueuedHandler,当在控制台中运行或通过Web请求运行时,它不会注册该类。因此,以下检查起作用,并区分队列和在控制台上运行。

// true when code is in the queue
app()->resolved(\Illuminate\Queue\CallQueuedHandler::class);

"第二个"
当Laravel启动队列作业时,会有一个带有回调的事件,您可以使用该事件在服务容器中附加一些当前正在队列中运行的标志。

// Within the boot method of a service provider
App::bind('processing-job', function ($app) {
    return false;
});
Queue::before(function (JobProcessing $event) {
    App::bind('processing-job', function ($app) {
        return true;
    });
});

然后,您可以在任意位置运行检查,如下所示:

App::get('processing-job');

运行测试时,如果env var QUEUE_CONNECTION设置为sync,则测试将认为您处于排队进程中。这是因为在同步工作时,您的测试和作业都在同一示例中。

相关问题