2010-05-11 6 views
0

한 번에 10 명의 사용자를 확보하고 여러 가지 일을하는 일일 크론 작업이 있습니다. 이 프로세스의 일부인 사용자는 매일 1000 명입니다. 크론 작업이 서버로드에서 무거워서 겹치기를 원하지 않습니다. 그들은 다양한 API에서 물건을 호출하므로 시간 초과 및 느린 데이터 가져 오기가 있습니다.PHP 스크립트를 실행하는 크론 작업의 수를 제한합니다.

플래그를 사용하여 cron 작업을 실행 중으로 표시하려고 시도했지만 일부 PHP 스크립트가 시간 초과되거나 다양한 방법으로 실패 할 수 있으므로 충분히 신뢰할 수 없습니다.

cron 작업이 PHP 스크립트를 여러 번 호출하지 못하도록하거나, 호출 횟수를 제어하는 ​​좋은 방법이 있습니까? 예를 들어 인스턴스가 3 개뿐입니다.

나는 가능한 한 PHP에서 해결책을 선호합니다.

현재 데이터베이스의 값으로 플래그를 저장하고 있는데 잠금 유형 파일을 사용하고 있습니다. https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution?

답변

3

데이터베이스의 테이블을 통해 실행되는 스크립트 수를 추적하는 더러운 방법을 사용했습니다. 실행 된 스크립트는 행 id과 필드 started_time을 삽입합니다. 출구에서 그것은 그의 행을 제거합니다. 너무 오래된 행은 "failed \ dead scripts"로 간주됩니다.

작업자 스크립트는 cron에 의해 직접 시작되지 않습니다. Cron은 1 초마다 "실행 프로그램 스크립트"를 실행합니다.이 스크립트는 활성 작업자 수를 확인하고 필요한 경우 더 많은 작업자를 생성합니다.

이러한 계획은 이미 2.5 년 동안 온라인으로 작업하고 있습니다. 그냥 지속적으로 업데이트되는 일부 콘텐츠를 가져 오는 것입니다.

+0

나는 추적 PID를보고있다. 나는 또한 현재 시작 시간을 저장하고 있으므로 잘 작동한다면 시도해 보도록하겠습니다. 감사합니다! – ed209

1

비슷한 문제가있어서 가장 쉬운 해결책 인 것처럼 약간의 데몬을 만들었습니다.

0

쉘에서 스크립트를 실행할 수있는 명령 줄 액세스 권한이있는 경우, 제가 설명한대로 How feasible is a daemon written in PHP, using ignore_user abort and set_time_limit(0)에있는 스크립트와 링크 된 블로그 게시물을 작성하고 싶습니다. 그 대답에서 나는 데이터를 처리하는 장기 실행 PHP 스크립트를 설명합니다. /가 종료되면 bash 스크립트가 랩핑되어 다시 시작되어 작업을 완료 할 수 있습니다. 다시 실행해야하고 단지 sleep($howLongToWaitTillRunAgain);

0

당신은 반복해서 지방 컨트롤러를 사용하여 호출까지 PHP 스크립트는 그것이 모두가 일에 대한 작업의 수행했다고 결정했다

, 그것은 얼마나 많은 초를 계산 스크립트를 실행하십시오. CRON과 달리 스크립트의 한 인스턴스가 종료 되 자마자 스크립트의 다른 인스턴스를 다시 실행할 수 있습니다.

스크립트에서 피드백을 줄 수도 있습니다. 현재로서는 아무 것도 할 수 없으며 Fat 컨트롤러는 스크립트를 다시 실행하기 전에 잠시 잠자기 상태가됩니다.

정말로 모험을 느끼는 경우 큐가 실제로 가득 차면 The Fat Controller를 사용하여 여러 인스턴스의 스크립트를 동시에 실행할 수 있습니다.하지만 원하는 경우가 아닙니다.

www.4pmp.com/fatcontroller/

관련 문제