2010-04-21 3 views
10

저는 하루에 수천 건의 무거운 PHP 작업을 수행하는 가장 효율적인 방법을 찾아 내려하고 있습니다. Gmail에 IMAP 연결을 만들고 이메일을 반복하여이 정보를 데이터베이스에 저장하고 이미지를 로컬에 저장해야합니다.크론 작업으로는 충분하지 않은 경우 무엇을 사용합니까? (PHP)

cron을 사용하여이 작업을 자주 실행하는 것은 그리 큰 문제가 아니지만 매분마다 실행해야하며 결국에는 cron이 서로 실행되어 메모리 문제가 발생한다는 것을 알고 있습니다.

1 분에 여러 번 작업을 효율적으로 실행해야 할 때 다음 단계는 무엇입니까? 나는 beanstalk & pheanstalk에 대해 읽었으며, 그것이 내가 필요한 것을 할 수 있을지 확실하지 않습니다. 생각들 ???

+0

이것은 질문과 직접 ​​관련이 없지만 CURL을 사용하여 이미지를 검색합니다. file_get_contents()와 다른 네이티브 파일 함수는 그렇지 않지만, DNS 요청을 캐시합니다. 이전에 이미지를 검색하기 위해 스크립트를 작성해야했지만, 거의 모든 실행 시간은 네트워크 대기 시간이었습니다. 그래서 그것은 그것을 줄이기 위해 조금을 도울 수 있습니다. – Savageman

답변

7

스크립트가 겹치지 않도록 잠금 메커니즘을 만드십시오. 이 스크립트는 분마다 실행으로 매우 간단, 단순 .lock 파일이 충분 :

<?php 
    if (file_exists("foo.lock")) exit(0); 
    file_put_contents("foo.lock", getmypid()); 

    do_stuff_here(); 

    unlink("foo.lock"); 
?> 

이 확인 스크립트가 병렬로 실행하지 않는 것, 당신은 단지 확인 .lock 파일이 삭제되어 있는지 확인해야 프로그램이 종료 될 때, 당신은 한 점의 출구를 가져야한다. (처음에는 출구를 제외하고).

브라이언 로치 (Brian Roach)가 제안한 좋은 대안은 항상 실행되는 IMAP 서버 연결을 유지하는 전용 서버 프로세스입니다. 이 오버 헤드를 많이 줄이고 더 힘들어 정상적인 PHP 스크립트 작성하는 것보다되지 않습니다 : 나는 그들이 스택 경우 크론에서 그들을 실행하지 않으 이와 같은 스크립트의 숫자를 가지고

<?php 
    connect(); 
    while (is_world_not_invaded_by_aliens()) 
    { 
    get_mails(); 
    get_images(); 
    sleep(time_to_next_check()); 
    } 
    disconnect(); 
?> 
+2

나는 데몬이 최선의 선택이 될 것이며 IMAP을 열어두면 일이 훨씬 빨라질 것이라고 생각한다. 조언 해주셔서 감사합니다! – mike

10

저는 PHP 사용자가 아니지만 스크립트로 데몬을 실행하지 못하게하는 이유는 무엇입니까? 필자는 그렇게하는 많은 펄 스크립트를 작성했다.

+0

필자는 전에 데몬을 작성한 적이 없지만 이제는 더 많은 조사를 시작하겠습니다. 제안 해 주셔서 감사합니다. – mike

+0

기본적으로 ... 모든 것을 'while (1)'로 감싸고 백그라운드에서 스크립트를 실행합니다. 만약 죽이는 것보다 뭔가를하는 것이 중요하다면, 신호 처리를 들여다보고 나가기 전에 정리할 수 있습니다. backgorund에서 쉘에서 실행되도록 요구하는 것보다 fork를위한 보너스 포인트 : –

+0

2 개의 파일을 제안합니다 : 첫 번째 파일은 데몬을 실행하는 다른 프로세스를 만듭니다. 처음에는 몇 초 기다렸다가 데몬이 아직 실행 중인지 확인합니다. 그렇지 않으면 다시 시작할 수 있습니다. 필자는 그렇게 오랜 시간 동안 PHP를 사용하지 않기 때문에주의를 기울이는 것이 더 낫다고 생각합니다. – Savageman

3

을 -쪽으로.

#!/bin/sh 
php -f fetchFromImap.php 
sleep 60 
exec $0 

exec $0 부분은 스크립트를 다시 실행 메모리 자체를 교체 시작, 그래서 문제없이 영원히 실행됩니다. PHP 스크립트가 사용하는 메모리는 종료 될 때마다 정리되므로 문제가되지 않습니다.

간단한 라인을 시작하고 배경에 넣어 것입니다

cd /x/y/z ; nohup ./loopToFetchMail.sh & 

또는 기계는 크론의 다양한 수단 (시작 때 유사하게 시작할 수 있습니다 '@reboot ....')

0

fcron http://fcron.free.fr/ 이전 작업이 아직 실행 중이라면 @ 1 command을 사용할 수 있으며 경쟁 조건에 대해 걱정할 필요가 없습니다.

관련 문제