2016-08-18 3 views
1

안녕하세요!Laravel 5.2 : Laravel Queues 서비스를 사용하여 데이터베이스 삽입 처리

내 컨트롤러에 다음 코드를 가지고 :

$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에서 개발 한 API를 사용하여 Laravel 데이터베이스에 필요한 많은 데이터를 반환합니다.

API는 최대 10 개의 항목 (많은 양의 데이터 포함)을 반환합니다. Drupal 데이터베이스에는 매일 밤 가져올 필요가있는 항목이 ± 17000 개 있습니다. Queue API가 데이터를 한꺼번에 가져 오는 대신 일괄 적으로 가져 오기위한 좋은 솔루션이라고 생각했습니다. 루프에 $uris 배열을 반복하면 foreach 루프에서 $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 테이블에도 레코드가 없습니다.

핸들 기능이 실행되지 않아 내부에서 일어나는 일을 로그 할 수 없습니다. 예를 통해 인터넷에서 정보를 찾으려고 노력했지만, 필자가 필요로하지 않는 메일 링 사례를 찾을 수 있습니다.

도움이 될 것입니다.

답변

1

문제가 해결되었습니다. 직장 코드 protected $payload에 반드시 있어야합니다! 페이로드는 큐 핸들러에 전달하려는 데이터입니다.