Laravel 队列作业不加载文件

Posted

技术标签:

【中文标题】Laravel 队列作业不加载文件【英文标题】:Laravel queue job does not load file in 【发布时间】:2020-01-01 09:56:05 【问题描述】:

我有点卡在加载 Laravel 队列/作业的文件

我正在使用 Laravel 排队/异步作业(我们称它为作业以便于使用)

好吧,让我们从头开始,我们有自己的翻译功能,我们也将它命名为__(),就像 Laravel 的默认值一样,不要问我为什么等等。(简单的解决方案就是重命名它,我知道)但这是我必须坚持的(除非这可能无法修复)。

所以要在 Laravel 之前声明函数,我们是否像这样在 index.php 中的自动加载之前插入函数。

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/
require __DIR__.'/../app/Helpers/localization.php'; <-- yes this file
require __DIR__.'/../vendor/autoload.php';

如果我们使用SomeJob::dispatchNow()(非异步)执行作业,这对网站来说很好用

但是当我们想要做一个像SomeJob::dispatch() 这样的异步工作时,index.php 不会被调用,所以这个文件永远不需要,所以函数也不需要。 (还是我错了?)

我用composer.js自动加载试过了

"autoload": 
    "psr-4": 
        "App\\": "app/"
    ,
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "files": [
        "app/Helpers/helpers.php", <-- works fine
        "app/Helpers/Localization.php" <-- it does include tho
    ]
,

现在在文件中我们使用if (! function_exists('__')),但此时该函数已经声明,在网站本身上它也不起作用。

简而言之,index.php 中的 require 仅适用于网站,而不适用于异步作业,因为在队列执行作业时永远不会调用 index.php。

使用 Composer 自动加载对网站或作业都不起作用,因为在我们声明之前,Laravel 已经声明了该函数。

那么我应该在哪里需要文件/声明函数,以便网站直接和异步作业都可以使用我们的函数版本。

附:我知道我的英语不是那么好,所以如果有什么不清楚的地方,或者即使我错过了任何信息,请询问我,我会尝试编辑帖子以使其更清晰。

【问题讨论】:

【参考方案1】:

你可以将你的函数定义添加到 laravel 的 bootstrap 文件的开头bootstrap/app.php

或者(因为我怀疑 SomeJob::dispatch() 使用 artisan),您可以在 index.phpartisan 中要求您的文件

#!/usr/bin/env php
<?php

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/app/Helpers/localization.php';
require __DIR__.'/vendor/autoload.php';

$app = require_once __DIR__.'/bootstrap/app.php';

【讨论】:

今天你是我的英雄!我没有注意到有一个artisan 文件。谢谢!

以上是关于Laravel 队列作业不加载文件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.7 - 队列作业太慢

什么会阻止队列中的作业处理? [PHP / Laravel 5]

Laravel队列:不允许“关闭”的作业序列化

Laravel 队列 - 作业之间暂停

Express 中的 Laravel 队列作业相当于啥?

Laravel 队列:在主机中永远运行的工作?