Laravel 6.10 应用程序在本地工作,但在生产服务器上失败,"Target class [] does not exist."



这个问题专门处理Laravel 6.10和队列处理。在我的本地机器上,程序运行良好,所有排队的作业都能很好地加载并处理完成。在我的GoDaddy服务器上,当作业试图加载时,我收到一个神秘的错误,上面写着:

在/home/jaredclemence/public_html/thenjassistant.com/vendor/laraavel/framework/src/IIlluminate/Container.php中的第805行引发错误,消息为:目标类[]不存在。跟踪:#0/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/Container.php(681):Illuminate\Container\Container->build(NULL)#1/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/Container.php(629):Illuminate\Container\Container->resolve(NULL,Array)#2/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Foundation/Application.php(776):Illuminate\Container\Container->make(NULL,Array)#3/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Jobs/Job.php(215):Illuminate\Foundation\Application->make(NULL)#4/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Jobs/Job.php(88):Illuminate\Queue\Jobs\Job->resolve(NULL)#5/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Worker.php(354):Illuminate\Queue\Jobs\Job->fire()#6/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Worker.php(300):Illuminate\Queue\Worker->process("数据库",Object(Illuminate\Queue\Jobs\DatabaseJob),Object(Illuminate\Queue \WorkerOptions))#7/home/jaredclement/public_html/thenjassistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Worker.php(134):Illuminate\Queue\Worker->runJob(对象(Illuminate\Queue\Jobs\DatabaseJob),"数据库",对象(Illominate\QueQueue\WWorkerOptions))#8/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Console/WorkCommand.php(112):Illuminate\Queue\Worker->守护进程("数据库","默认",对象(Illuminate\Queue\WWorkerOptions))#9/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Queue/Console/WorkCommand.php(96):Illuminate\Queue\Console\WorkCommand->runWorker("数据库","默认")#10【内部功能】:Illuminate\Queue\Console\WorkCommand->handle()#11/home/jaredclement/public_html/thenjassistant.com/vendor/laraavel/framework/src/Ilightaine/BoundMethod.php(32):call_user_func_array(数组,数组)#12/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/Util.php(36):Illuminate\Container\BoundMethod::Illumination\Container\{closure}()#13/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/BoundMethod.php(90):Illuminate\Container\Util::unwrapIfClosure(Object(Closure))#14/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/BoundMethod.php(34):Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application),Array,Object(Closure))#15/home/jaredclement/public_html/thenjasistant.com/vendor/laraavel/framework/src/IIlluminate/Container/Containe.php(590):Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application),Array,Array,NULL)#16/home/jaredclement/public_html/thenjassistant.com/vendor/laraavel/framework/src/IIlluminate/Console/Command.php(201):Illuminate\Container\Container->call(Array)#17/home/jaredclement/public_html/thenjasistant.com/vendor/symfony/console/Command/Command.php(255):Illuminate\console\Command->execute(Object(symfony\Component\console\Input\ArgvInput),Object(Illuminate\console\OutputStyle))#18/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Console/Command.php(188):Symfony\Component\Console\Command\Command->run(对象(Symfony/Component\Console\Input\ArgvInput),对象(Illuminate\Console\OutputStyle))#19/home/jaredclement/public_html/thenjaassistant.com/vendor/symfony/console/Application.php#20/home/jaredclement/public_html/thenjaassistant.com/vendor/symfony/console/Application.php(272):symfony\Component\console\Application->doRunCommand(对象(Illuminate\Queue\console\WorkCommand)、对象(symfony/Component\console\Input\ArgvInput)、对象#21/home/jaredclemence/public_html/thenjaassistant.com/vendor/symfony/console/Application.php(148):symfony\Component\console\Application->doRun#22/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Console/Application.php#23/home/jaredclement/public_html/thenjaassistant.com/vendor/laraavel/framework/src/IIlluminate/Foundation/Console/Kernel.php(131):Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Componnect\Console\Output\ConsoleOutput))#24/home/jaredclement/public_html/thenjasistant.com/artisan(37):Illuminate\Foundation\Console\Cernel->handle(对象(Symfony\Component\Console\Input\ArgvInput),Object(Symfony \Component \Console\Output \ConsoleOutput)#25{main}

我相信问题开始了,并将通过修复第4项的跟踪来解决,其中调用了以下内容:IlluminateQueueJobsJob->resolve(NULL)。我在GoDaddy服务器上的两个失败作业中都看到了这种情况,但在本地不会发生。我对laravel的了解还不够,无法理解NULL值的来源以及如何修复它。这发生在加载作业类之前,但并不是所有排队的作业都会发生。只有这一类的工作。

在本地副本和生产副本中,我都使用GoDaddy数据库,因此两个系统都与同一个数据库主机通信。我使用名为CMP_dev和CMP_core的数据库来区分开发表和生产表。因为我使用的是相同的数据库源,所以我可以排除mysql设置中的更改。

我升级了所有的composer包并重新测试。然后,我提交了composer.lock文件,并更新了GoDaddy服务器以匹配。所以,我可以排除其他人已经修复的旧错误代码的问题。

服务器上的PHP版本是7.3.11,本地dev上的PHP版是7.3.6。好消息是,它们都是7.3.X,这降低了语言变体的风险,但在7.3.6和7.3.11之间可能仍然存在问题,但GoDaddy不允许我将PHP设置控制在7.3的次要版本号之外。

----添加于2020年1月9日------我想这可能是网络服务器的不同。在我的本地机器上,我使用php artisan serve来托管软件。在GoDaddy上,我使用Nginx。然而,后来我意识到运行队列的不是服务器。命令行运行队列,并且这两个命令都使用php artisan schedule:run运行。这排除了web服务器软件及其所有组件。-------->-

我已经成功地运行了排队邮件作业,这意味着队列可以工作。这应该将问题本地化为为为我生成问题的两个类。如果我能用其中一个找到问题,我很可能会用第二个找到问题。所以我将在这里包括第一个导致问题的作业:

app/Jobs/ConvertCsvFileToIntermediateFile.php:

namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use AppContactCsvFile;
use IlluminateSupportFacadesLog;
class ConvertCsvFileToIntermediateFile implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $timeout = 500;
/** @var ContactCsvFile */
private $file;
private $delegate;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(ContactCsvFile $file, $delegate = null)
{
$this->file = $file;
$this->delegate = $delegate;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$this->file->process($this->delegate);
}
}

错误发生在调用handle()之前。我知道这一点是因为,当我将dd($this->file)作为句柄的第一行时,永远不会到达该行。

此外,我认为需要注意的是,当大多数作业失败时,它们的类名会列在queue:failed表中。但在这种情况下,queue:failed表读取时间:"2020-01-08 09:23:23。">

+---------------+----------------+----------------+|ID|连接|队列|类|失败时间|+----+------------+---------+---------------------+-----------+|2|数据库|默认|2020-01-08 09:23:23||+----+------------+---------+---------------------+-----------+

您必须阅读laravel 6.10发行说明。。某些函数已弃用并已修复。我认为你必须添加php第九单元而不是v8不受支持,并将其添加到composer所需而非dev

我仍然不知道这个错误的含义是什么,也不知道如何修复它。然而,我找到了解决这个问题的方法,我将在这里描述它,以防它帮助其他人解决这个问题。

我开始怀疑,队列:failed表中出现的奇怪数据库条目表明发生了可怕的事情,导致程序在执行过程中失败,这可能导致对数据库的部分写入。作为一个逻辑解决方案,这对我来说没有意义,因为我在事务中运行的作业应该在失败时回滚。

话虽如此,我研究了一个潜在的内存膨胀问题和超时问题。我一直遇到超时问题,但类已经设置为public $timeout = 500;,它应该保证在作业失败之前有整整500秒的时间(这些作业在不到一分钟的时间内失败)。即使该类允许500秒,GoDaddy也可以限制进程运行的时间,因此进程可能花费了太长时间。

GoDaddy还可以限制每个进程允许的内存量。由于作业处理的是大型数据数组,因此可以通过为每个项目创建一个作业来解决时间长度问题和内存膨胀问题,而不是创建一个迭代数组的作业。

这就是我解决问题的方法我确实创建了一个只处理一个项目的作业。我没有将整个数组发送到一个作业,而是迭代数组,并将每个项发送到作业。我认为这会增加系统处理每个项目所需的时间,因为程序必须在加载每个作业时为其引导应用程序,现在我有数百个作业而不是一个。但是,如果总时间增加,处理单个作业的时间肯定会减少,因为该作业只处理单个项目,然后关闭。一旦我做了这个更改,GoDaddy服务器就停止抛出NULL错误,一切都运行得很好。

我还惊讶地发现,较小的作业也比使用阵列的单个作业完成得更快。尽管系统必须在每个作业上引导应用程序,但当内存没有过载时,系统运行得更快。

相关内容

最新更新