2009-04-12 1 views
1

일부 MySQL 작업을 수행하는 "update.php"파일이 있습니다. cron 작업은 5 분마다이 파일을 실행합니다. 불행히도 cron 작업을 더 자주 실행할 수 없습니다. PHP 기반 cron 작업을 더 자주 실행하려면 어떻게합니까?

그래서 나는 페이지 " update.php"에 ... 내가 추가 할 수 있습니다 생각 ...

<html> 
<head> 
    <meta http-equiv="refresh" content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" /> 
</head> 
<body></body> 
</html> 

했다. cron이 페이지를 자동으로 새로 고치는 방식으로 파일을 실행합니까? 아니면 브라우저가있는 클라이언트가 없기 때문에 발생하지 않습니까?

메타 새로 고침이 효과가 없다면 다른 방법으로 페이지 새로 고침을 수행 할 수 있습니까?

미리 감사드립니다.

+0

투표가 취소되는 이유에 대해 관심이 있으십니까? – madcolor

답변

11

내가 그 원 두려워 웹 서버 시작시 시작 (... 등, netcat을, wget을) 일부 크론 스크립트는 페이지를 직접 호출 할 수있는 코드 변경을 contempling하지 페이지를 새로 고치는 브라우저 기능이기 때문에 작동하지 않습니다.

질문 : 왜 5 분마다 더 자주 실행되도록 cron 작업을 설정할 수 없습니까?

다른 옵션이 없다면 자신을 데몬으로 만들면 더 자주 작업을 수행 할 수 있습니다.

(기준 : 귀하의 PHP 스크립트는 수 :

  • 종료
  • 예를 들어 (두 번 이상; 실행을 대기)

  • 은 60 초
  • 실행
  • 을 기다립니다

    • 실행 유사 변형 sshow의 코드)

      <?php 
      
      $secs = 60; 
      
      ignore_user_abort(true); 
      set_time_limit(0); 
      
      dostuff(); 
      sleep($secs); 
      dostuff(); 
      sleep($secs); 
      dostuff(); 
      sleep($secs); 
      dostuff(); 
      sleep($secs); 
      dostuff(); 
      
      ?> 
      

      이 스크립트 버전은 4 분간 상주하며 5 분마다 cron에서이 스크립트를 실행하면 매분마다 실행하는 것과 같은 4 번 코드를 실행합니다.

      cronjob이 무엇인지, 어떻게 실행되는지 혼란스러워 보입니다.

      cron은 백그라운드에 앉아있는 데몬이며 crontab에 지정된 일정으로 셸을 통해 작업을 실행합니다.

      각 사용자마다 crontab이 있으며 시스템 crontab이 있습니다.

      각 사용자의 crontab은 해당 사용자로 실행되는 작업을 지정할 수 있습니다. 예를 들어

      :

      */5 * * * *  echo "This will be run every five minutes" 
      

      또는 매 분마다 실행 :

      * * * * *  echo "This will be run every minute" 
      

      명령의 출력이 이메일로 발송됩니다

      # run five minutes after midnight, every day 
      5 0 * * *  $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 
      # run at 2:15pm on the first of every month -- output mailed to paul 
      15 14 1 * *  $HOME/bin/monthly 
      # run at 10 pm on weekdays, annoy Joe 
      0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?% 
      23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 
      5 4 * * sun  echo "run at 5 after 4 every sunday" 
      

      그래서 5 분마다 실행 crontab의 소유자 (또는 MAILTO가 지정한대로). 즉, 모든 일반 출력이 표시되거나 리디렉션되지 않는 한 매 분마다 이메일을 보낼 것입니다.

      명령은 'nobody'사용자로 실행되는 웹 서버에 의해 실행되는 스크립트와 대조되는 crontab을 소유 한 사용자로 실행됩니다 (또는 유사하게 - 웹 서버가 실행되도록 구성됨). 같이). 이것은 cronjob이 웹 서버에 의해 실행되는 스크립트에 의해 액세스 될 것으로 예상되는 파일에 기록하는 경우 삶을 더 복잡하게 만들 수 있습니다. 기본적으로 사용 권한이 올바른지 확인해야합니다.

      이제이 시스템이 귀하가 참조하고있는 시스템인지 확신 할 수 없습니다. cronjob으로 다른 것을 의미하면 위의 내용이 적용되지 않을 수 있습니다.

      현재 호스트에서 허용하지 않는 작업을 수행하려는 경우 제한 사항을 해킹하지 않고 호스팅 제공 업체를 전환하는 방법을 고려해야합니다.


      대안은 당신이 좋아하는 어떤 주파수에서 반대는 wget 일부 외부 스케줄러 실행하면 정상적인 스크립트 위치 야에 스크립트를 넣어 것입니다.


      또 다른 대안은 vartec의 제안의 형태의 주문형 업데이트입니다. 그러나 그것은 당신의 문제를 해결하지 못할 수도 있습니다.

  • +0

    고마워요! 그래서 나는 그것을 성취 할 다른 방법을 선택해야합니다. 귀하의 제안이 효과가있는 것 같습니다. 그러나 내 서버에는 동시에 실행되는 스크립트에 대한 제한이 있다고 생각합니다. 그리고 최대치가 있습니다. 실행 시간. 그런 다음 스크립트는 논스톱으로 실행됩니다 (limit-1). 그래도 될까요? – caw

    +0

    이 스크립트는 한 번만 실행하면됩니다 (각 복사본은 5 분 후에 종료되어야합니다) (확실하게하려면 4 분이 걸릴 수 있습니다). 맥스를 강제하는 것은 무엇입니까? 실행 시간? 아파치라면 아파치 외부에서 실행되므로 중요하지 않습니다. –

    +0

    OK, thx. 나는 그것이 최대를 시행하고 있다고 생각했다. 실행 시간은 다음과 같습니다. 스크립트는 6 초 동안 실행 된 다음 45 초 동안 대기합니다. 루프를 사용하면 이것을 5 번 반복합니다. 그래서 분당 한 번씩 실행되는 cronjob이 있습니다. 절전 시간은 계산되지 않지만 6x6 = 36secs가 실행 시간입니다 (최대 30). – caw

    -2

    사용자 상호 작용을 의미하는 것이므로 클라이언트가 "페이지"에 들어 가지 않으면 어떻게됩니까?

    예를 들어 서블릿과 EJB 컨테이너는 필요한 컨테이너를 시작할 때 프로그래밍 방식으로 처리 할 수 ​​있습니다. 따라서 PHP에서는 "자동"cronlike 작업을 수행하는 유일한 방법은 Apache 소스 코드에서 일부 변경을 수행하는 것입니다 주택 서버를 사용하는 경우.

    더 praticable 옵션은 '

    1

    업데이트 : 새로운 정보를 기반으로 편집 됨.

    cronjob.de는 실제로 페이지의 내용을 읽지 않는 자동화 된 시스템을 사용하기 때문에 메타 새로 고침이 작동하지 않습니다. 브라우저가 없으므로 메타 새로 고침을 볼 수 없습니다.

    몇 가지 옵션이 있습니다. 그것들은 더 크거나 작다.

    가장 좋은 방법은 웹 호스트를 변경하는 것입니다. 좋은 웹 호스트는 cron을 완전히 지원합니다. 하지만 cron을 만져야한다면 솔직히 VPS 호스트에 있어야합니다. 많은 호스트가 매 순간마다 cron 태스크를 실행하는 것을 거부 할 것입니다. 그러나 VPS 호스트는 일반적으로 신경 쓰지 않습니다. Slicehost는 월 $ 20 정도의 적은 비용으로 VPS 서버를 제공합니다. 이전에는 루트 액세스 권한이없는 사람에게 권장되지 않습니다.

    cronjob.de의 5 분 제한과 함께 사용할 수있는 유일한 옵션은 반복 실행, 잠자기, 다른 반복 실행, 반복 횟수를 반복하는 루프를 만드는 것입니다. 5 분. 그러나이 접근 방식에는 두 가지 주요 문제점이 있습니다.첫째, 4 분 동안 요청을하면 요청이 완료되기 전에 웹 호스트가 요청을 죽일 가능성이 있습니다. 둘째, 웹 서버가 올바르게 구성되지 않은 경우 이러한 요청은 다른 요청을 차단하여 합법적 인 사용자가 사이트에 액세스하지 못하게 할 수 있습니다. 대기열에 들어가기도하고 요청이 완료되기 전에 cronjob.de 요청이 완료 될 때까지 기다릴 수도 있습니다 . 요청이 완료되기까지 4-5 분이 걸리므로 1 분 후에 반복되기 전에 5 분마다 한 번만 사이트에 액세스 할 수 있습니다. 나는 이것이 바람직하지 않다고 생각한다. 불행히도, 당신이이 문제들 중 어느 하나를 범할 것인지를 아는 유일한 방법은 웹 호스트에게 물어 보는 것입니다. 내가 예기치 않게 나빠질 수 있고 서버의 다른 고객에게 영향을 미치기 시작하면 감사하지 않을 수도 있기 때문에 질문하기 전에 시도하지 않는 것이 좋습니다.

    운이 좋으면 크론 작업을 기꺼이 설정할 수도 있습니다.

    +0

    답변 해 주셔서 감사합니다! 내 웹 호스트는 cronjob을 전혀 제공하지 않습니다. 그래서 나는 5 분마다 열리는 URL을 추가하는 독일어 웹 서비스 인 cronjob.de를 사용합니다. 그러나 5 분이면 충분하지 않습니다. 나는 더 작은 간격이 필요하다. 그래서 나는 여기서 해결책을 찾는다. – caw

    +0

    아, 그래, 그게 좀 더 설명해. 이 경우 PHP는 완전히 미친 생각이 아닙니다. 아마도 원래의 질문에서 언급 했어야합니다. –

    2

    나는 PHP로 이것을하려고하지 말라고, 귀하의 crontab을 변경하십시오. 애플리케이션에 매분 cronjob을 수행해야하고 호스팅에서이 옵션을 제공하지 않으면 호스팅을 능가 할 가능성이 큽니다. 한 달에 20 $ (Slicehost, Servergrove)에 VPS를 호스팅하십시오.

    3

    난 당신이 일을하여 얻을 수 있습니다 확신 해요 :

    당신이 더글러스처럼 그렇게하지 않으면 당신은 모든 서버를 다시 시작한 후 한 번 실행해야합니다 설명

    <?php 
    
    $secs = 120; 
    
    ignore_user_abort(true); 
    set_time_limit(0); 
    
    while (true) 
    { 
        // do something 
    
        // Sleep for some time 
        sleep($secs); 
    } 
    
    ?> 
    

    편집.

    업데이트

    마음에 더글러스 Leeder 씨의 답변을 유지하고 이것 좀 걸릴 :

    http://www.php.net/manual/en/function.ignore-user-abort.php

    +0

    고마워요! 나는 그것을 시험해보고 작동한다. 그래서 무제한으로 (거의) 실행되는 스크립트를 만들 수 있습니다. 하지만 서버에 "상처"를주지는 않습니까? ignore_user_abort (true)가 실제로 필요합니까? PHP가 사용자가 페이지를 닫았다는 것을 어떻게 알 수 있습니까 (클라이언트는 연결이 끊어졌습니다)? – caw

    +0

    실현 여부는 중요하지 않습니다. 그것은 단지 실행을 끝내지 않습니다. – sshow

    +0

    그래서 ignore_user_abort (true)가 필요하지 않습니까? – caw

    0
    스크립트를 호출하는 PHP를 사용할 수 있습니다

    ...

    <?php 
    $script='/path/to/my/php/script.php'; 
    
    ignore_user_abort(1); 
    set_time_limit(0); 
    $php=exec('which php'); 
    while (1) { 
        if (file_exists($script)) { exec($php.' '.$script); } 
        else { file_get_contents($script); } 
        sleep(2); 
    } 
    ?> 
    

    $ script를주는 파일이 있어야하며, 그렇지 않으면 URL이라고 생각합니다.

    트릭을해야합니다.

    +0

    해답을 찾아 주셔서 감사합니다. 하지만 왜 내가 exec()가 필요합니까? 호출해야하는 스크립트 또한 PHP입니다. 그래서 include()를 사용하거나 하나의 단일 파일 만 사용할 수 있습니다. 권리? – caw

    관련 문제