2011-09-12 5 views
2

사용자가 시간과 날짜를 지정하여 2 개의 예약 된 작업 (시작 날짜와 종료 날짜 중 하나)을 실행할 수있는 웹 응용 프로그램을 만들고 있습니다. 이것들은 한 번만 실행되기 때문에 cron 작업이 적절한 지 모릅니다.PHP에서 일회성 작업을 어떻게해야합니까? 크론?

내가 생각 다른 옵션은, $usertime == NOW() 경우 등을 확인하기 위해 DB에 작업 시간을 모두 저장하고 cron 작업을 매 시간마다 실행하는 것입니다하지만 중복 작업에 대한 걱정했다 생각?

추가 : 많은 사용자가 각각 2 개의 스크립트를 실행하는 많은 작업을 만들 수 있습니다.

+5

봐 ['at'] (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) – arnaud576875

+1

아르노의 그것을 얻었다. 'at '는 특정한 시간에 일자리를 구하는 일이다. cron은 반복되는 작업입니다. at와 cron은 모두 스케줄링에 1 분 단위로 세분화되어 있으므로 두 번째가 필요하면 직접 지연해야합니다. –

+0

그들이 빈번하다면, 매시간 크론 작업이 가장 좋은 아이디어라고 생각합니다. 중복되는 문제가 무엇인지 확실하지 않은 경우 문제없이 동시에 여러 번 호출되는 동일한 스크립트를 사용할 수 있습니다. 외모가 좋을 때 –

답변

1

나는 그런 식으로 데이터베이스의 설정을 저장하고 작업을 시작해야하는 경우 필요할 때를 확인합니다.

매분마다 점검/시작 cronjob을 실행할 수 있습니다. 확인 코드가 너무 무겁지 않다는 것을 확인하십시오 (빠져 나오십시오). 여러 행에 대한 데이터베이스 쿼리는 매분마다 실행하는 것이 좋습니다.

"작업"이 너무 무거 우면 php를 호출하는 cronjob 대신 데몬을 고려해야합니다. Create daemons in PHP


편집 : 여기에 좋은 & 쉬운 읽기 소개합니다 내가 걸린 부여하는 작업 만 실행하는 경우에도 "한 번 각각"당신은 1이다 다수의 사용자가 다음에 1 "once once", 각 사용자에 대한 작업. 그렇지 않다면, at (의견에 따르면) 실험에 합당한 것으로 보입니다.

+0

답변 해 주셔서 감사합니다. 많은 사용자가 2 개의 스크립트를 실행하는 많은 작업을 만들 수 있습니다. – Sam

+0

@Sam : 데이터베이스 사용에 유리한 또 다른 것 : SQL로 이벤트 시간을 쉽게 수정할 수 있습니다. 나는 당신에 대해 모른다. 그러나 나는 "멍청한"기억 장치에 더 편할 것이고 논리 부분을 직접 작성해야 할 것이다. – chelmertz

+0

물론 이죠. 나는 여전히 중복에 대해 걱정할 것입니다. DB 검사 사이의 간격보다 더 오래 스크립트가 실행될 수 있도록 충분한 사용자를 확보하게되면 문제가 발생할 것입니다. – Sam

1

내가 선택한 메커니즘 (cron/at/daemon)은 시작 작업 만 대기열에 넣습니다. 그 시작 작업과 함께 끝 작업을 배치하는 것입니다. 그 부분은 미래로 그것을 놓을 수도 있고 시간이 경과 한 후에 즉시 시작할 수도 있습니다. 그런 식으로 그들은 결코 겹치지 않을 것입니다.

PHP/DB 및 cron 옵션도 선호합니다. 보다 단순 해 보이고 더 많은 유연성을 제공합니다. 성능에 따라 여러 스레드를 선택할 수 있습니다.

1

cron은 정기적으로 실행되는 스크립트에 적합하지만 특정 시간에 일회성 (또는 2 회성) 스크립트를 실행하려면 unix 'at'명령을 사용하면됩니다. 그것은 바로 다음과 같은 코드를 사용하여 PHP에서 :에

/**** 
* Schedule a command using the AT command 
* 
* To do this you need to ensure that the www-data user is allowed to 
* use the 'at' command - check this in /etc/at.deny 
* 
* 
* EXAMPLE USAGE :: 
* 
* scriptat('/usr/bin/command-to-execute', 'time-to-run'); 
* The time-to-run shoud be in this format: strftime("%Y%m%d%H%M", $unixtime) 
* 
**/ 

function scriptat($cmd = null, $time = null) { 
    // Both parameters are required 
    if (!$cmd) { 
     error_log("******* ScriptAt: cmd not specified"); 
     return false; 
    } 
    if (!$time) { 
     error_log("******* ScriptAt: time not specified"); 
     return false; 
    } 

    // We need to locate php (executable) 
    if (!file_exists("/usr/bin/php")) { 
     error_log("~ ScriptAt: Could not locate /usr/bin/php"); 
     return false; 
    } 

    $fullcmd = "/usr/bin/php -f $cmd"; 

    $r = popen("/usr/bin/at $time", "w"); 
    if (!$r) { 
     error_log("~ ScriptAt: unable to open pipe for AT command"); 
     return false; 
    } 
    fwrite($r, $fullcmd); 
    pclose($r); 

    error_log("~ ScriptAt: cmd=${cmd} time=${time}"); 

    return true; 
} 
관련 문제