안녕하세요!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 테이블에도 레코드가 없습니다.
핸들 기능이 실행되지 않아 내부에서 일어나는 일을 로그 할 수 없습니다. 예를 통해 인터넷에서 정보를 찾으려고 노력했지만, 필자가 필요로하지 않는 메일 링 사례를 찾을 수 있습니다.
도움이 될 것입니다.