2016-09-28 11 views
0

laravel app가 있습니다. 4 시간마다 실행되는 cronjob을 사용하고 csv 파일을 가져 와서 데이터베이스에 저장합니다.인터럽트를 사용하여 파일 가져 오기 - laravel

제한된 시간 (300 초 최대 실행 시간, 60 초 CPU 시간)이 있습니다. 가져 오기 스크립트는 많은 CSV 파일 (400 개 이상)을 가져와야합니다.

시간이 다 떨어지기 전에 중단하고 가져 오기 스크립트를 다시 호출하는 방법이 있습니까? 또는 파일을 안전하게 가져올 수 있도록이 문제를 어떻게 해결할 수 있습니까?

+0

작업 스케줄러를 사용합니다. 따라서 모든 "가져 오기 작업"을 대기열 (일반적으로 데이터베이스 기반)에 넣은 다음 하나씩 가져 오기 작업을 차례로 실행합니다. 그것은 작업 부하를 세분화합니다. 이제 제어 문자 만 갖도록 cron 작업을 구현할 수 있습니다. x 분마다 트리거되고 처리 할 작업이 있는지 확인합니다. 그렇다면 가져 오기 작업을 시작하고 종료하지 않으면 가져 오기 작업을 시작합니다. 중요한 부분은 제어 및 가져 오기 작업을 분리하는 것입니다. – arkascha

+0

아마존 또는 iron.io와 같은 타사 대기열 서비스를 사용하면 더 나은 결과를 얻을 수 있습니다. – madankundu

+0

두 가지 의견에 감사드립니다. @arkascha : 나는 당신의 제안으로 계속 노력할 것입니다. 저를 올바른 방향으로 안내해 주시겠습니까? 예를 들어 가져올 파일 이름이있는 대기열로 가져 오는 가져 오기 작업 클래스가 생깁니다. 같은 파일이 대기열에 제출되는 경우 신경 써야합니까? 작업을 큐로 푸시해야하는시기는 언제입니까? 한 가지 더 : 큐에서 작업을 어떻게 수행 할 수 있습니까? 데몬 대기열 작업자를 실행 하시겠습니까? (죄송합니다. laravel을 처음 사용하고 문서를 살펴 보았지만 여전히 이러한 질문이있었습니다.) – Seer

답변

0

아마도 프로세스를 완벽하게 보장하려는 경우 최적의 솔루션은 겹치지 않는 작업 일정을 사용하는 것입니다.

https://laravel.com/docs/5.2/scheduling#preventing-task-overlaps

그것은 여전히 ​​사실 cronjob에, 그러나 Laravel은 내부적으로 하나의 프로세스 만이 한 번에 실행 있는지 확인합니다 : 당신은 문서에 대한 모든 것을 읽을 수 있습니다. 따라서 매분마다 실행하도록 일정을 예약 할 수 있으므로 (예 : 일정이 매분마다 실행되도록) 일정이 끝난 후 즉시 다시 시작되도록하거나 상황에 따라 4 시간마다 실행되도록 예약합니다. 이전 일정이 아직 완료되지 않은 경우 다시 시작할 위험이 없습니다.

관련 문제