2016-08-18 112 views
1

早上好!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:listenphp artisan queue:work什么也没有发生。 failed_jobs表也没有任何记录。

句柄函数没有被执行,所以我不能记录里面发生的任何事情。我尝试用例子在互联网上找到信息,但我能找到的是一些我不需要的邮件例子。

任何帮助将不胜感激!

回答

1

修复了这个问题。确保你在你的工作代码protected $payload!有效载荷是您想要传递给队列处理程序的数据!