Php Laravel 5.2队列和作业-不推送到作业数据库
编辑2: 以下是我们正在经历的步骤:Php Laravel 5.2队列和作业-不推送到作业数据库,php,mysql,laravel,curl,laravel-5.2,Php,Mysql,Laravel,Curl,Laravel 5.2,编辑2: 以下是我们正在经历的步骤: 运行计划(为每个公司创建CollectHistoricalData作业) CollectHistoricalData应推送到队列(jobstable) CollectHistoricalData有一个函数ApiDaemon::GetCompanyWithQuery($company,$query),该函数从一个单独的类运行,该类也在其他几个地方引用 GetCompanyWithQuery收集数据并将其插入数据库 它一直运行到fine,但挂起的不是将作业插入到
CollectHistoricalData
作业)CollectHistoricalData
应推送到队列(jobs
table)CollectHistoricalData
有一个函数ApiDaemon::GetCompanyWithQuery($company,$query)
,该函数从一个单独的类运行,该类也在其他几个地方引用GetCompanyWithQuery
收集数据并将其插入数据库编辑1:
.env
文件设置为使用数据库
队列驱动程序
,我甚至尝试在config/QUEUE.php
文件中对其进行编码
我们正在使用Laravel5.2进行一个项目。在这个项目中,我们需要每小时卷曲一个url并将数据保存到数据库中。起初,我们使用Cron作业,基本上在一分钟内完成数千个卷发,这会由于负载而使PHP崩溃 我们决定转到拉威尔的工作和排队,但没有成功。我们正在为我们的工作使用数据库驱动程序,并尝试了许多不同的方法将工作放入数据库,因此我们的守护进程工作人员可以处理它们 这是我们现在的代码,我们正在使用Kernel.php
$schedule
启动这项工作,因此我们不会有数百个请求试图在一个小时内发生,这会导致数万次卷曲
Kernel.php时间表:
$schedule
->call(function () {
$items = DB::select('{selecting certain things to run}');
foreach ($items as $q) {
$this->dispatch(new CollectHistoricalData(Company::find($q->company_id), ApiQuery::find($q->query_id)));
}
})
->hourly()
->name('Historical Pulls')
->withoutOverlapping()
->before(function() {
$this->startTime = Carbon::now();
})
->after(function () {
mail({mail us a report afterward});
});
当它运行时,它会坐在那里一个接一个地运行它们,而不是将它们推到创建的Jobs表中
CollectHistoricalData.php:
<?php
namespace App\Jobs;
use App\Helpers\Daemons\ApiDaemon;
use App\Jobs\Job;
use App\Models\Company;
use App\Models\ApiQuery;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class CollectHistoricalData extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $company, $query;
/**
* CollectHistoricalData constructor.
* @param Company $company
* @param ApiQuery $query
*/
public function __construct(Company $company, ApiQuery $query)
{
$this->company = $company;
$this->query = $query;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
mail({let us know what started and when});
QueryDaemon::GetCompanyWithQuery($this->company, $this->query);
}
public function failed()
{
mail({mail us letting us know it failed});
}
}
嗯。。。我是哑巴
php artisan配置:清除
我没有清除配置的缓存。。。。哇…就像
php artisan config:clear
不适用于我我可以通过以下方式实现:
php artisan config:cache
在Laravel6.x中,在/env:QUEUE\u CONNECTION=sync=>QUEUE\u CONNECTION=database中编辑此项
然后处理数据可以插入作业表在.env
文件中指定的队列驱动程序
是什么?队列驱动程序
在.env
文件中设置为数据库
,而且我甚至尝试在配置/QUEUE.php
文件中以这种方式进行硬编码($q->company\u id)
和ApiQuery::find($q->query\u id)
正在做应该排队的工作?这会在内核中立即被调用,结果会被传递到作业类中。是的,每次都会找到公司和apiQuery,我看到他们在处理api信息并将其插入数据库,但它会一次处理一个,而不是将它们推入数据库队列。听起来您需要将公司
和ApiQuery
代码移动到句柄()中
排队作业的方法,这是排队后运行的唯一方法。这对我来说很有效。我不确定这是怎么回事。有人能解释一下吗?@grez您的配置信息可能已缓存在生产中,因此您必须清除缓存才能使更改生效