早上好!Laravel 5.2:使用Laravel队列服务处理数据库插入
我有下面的代码在我的控制器:
$num_rows = $this->drupalRequestRowCount();
$uris = $this->drupalRequestPrepareUri($num_rows, config('constants.IMPORT_DATA_URI'));
$requestHandler = new RequestHandler($uris[0]);
$content = $requestHandler->httpRequest();
// Dispatch each URI for the job that will handle
// the insertion of our Drupal data.
foreach($uris as $uri) {
$job = (new DataJob($uri))->onQueue('data_export_insert');
$this->dispatch($job);
}
return 'Jobs dispatched';
我有,我想每天晚上我Laravel数据库进行同步数据的Drupal数据库。我利用我自己在Drupal中开发的一个API,它返回我需要的大量数据以用于我的Laravel数据库。
该API最多返回10个项目(其中包含大量数据)。 Drupal数据库每天晚上需要导入+ - 17000个项目。我认为Queue API可能是一个很好的解决方案,可以批量导入数据,而不是一次导入所有数据。我循环遍历foreach循环中的$uris
数组,根据我得到的$num_rows
向API附加偏移量。
所以,如果$num_rows
返回17000项,则$uris
数组将包含1700项,像这样:
[0] => 'http://mywebsite.com/api/request_data.json?offset=0'
[1] => 'http://mywebsite.com/api/request_data.json?offset=10'
[2] => 'http://mywebsite.com/api/request_data.json?offset=20'
等
这意味着,我想有1700一旦我运行php artisan queue:listen database
命令,就会派遣Laravel执行我的任务。
以下代码是我要执行1700次的作业。
public function __construct($uri)
{
$this->uri = $uri;
}
public function handle()
{
try {
Log::info('Inserting data into database for uri: ' . $this->uri);
$requestHandler = new RequestHandler($this->uri);
$content = $requestHandler->httpRequest();
foreach($content as $key => $value) {
$id = $value->id;
$name = $value->name;
DB::insert('INSERT INTO table_1 (id, name) VALUES (?, ?)', [$id, $name]);
}
} catch(\Exception $e) {
Log::error('Error in job: '. $e->getMessage());
}
}
我的问题是,乔布斯根本没有得到执行。作业正在正确分派到数据库,因为当我检查数据库中的作业表时,可以在作业表中看到1700行。我试着记录手柄功能,但当我运行php artisan queue:listen
或php artisan queue:work
什么也没有发生。 failed_jobs表也没有任何记录。
句柄函数没有被执行,所以我不能记录里面发生的任何事情。我尝试用例子在互联网上找到信息,但我能找到的是一些我不需要的邮件例子。
任何帮助将不胜感激!