2013-07-13 3 views
0

나는 cron 작업으로 매 분마다 호출되는 간단한 PHP 스크립트를 가지고있다. 이 스크립트는 file_get_contents를 사용하여 데이터베이스를 일부 외부 소스로 업데이트하고 Nginx 서버에서 실행 중입니다.PHP 스크립트가 전체 서버를 차단할 수 있습니까?

스크립트가 실행되는 서버의 관리자는 스크립트가 전체 서버를 차단하는 경우가 있다고 말합니다. 그래서 간단한 로깅 메커니즘을 추가하여 스크립트 실행 시간을 확인했습니다. 결과 : 일반적으로 런타임은 1 초입니다. 때때로 스크립트가 많은 양의 데이터를 가져올 때 런타임은 조금 더 길지만 20 초를 초과하지는 않습니다.

//Logging 
require "db_hweb_functions/KLogger.php"; 
$log = KLogger::instance(dirname(__FILE__) . "/db_hweb_log", KLogger::DEBUG); 
$log->logInfo("++ Cron gestartet ++"); 

$lockfile = realpath($_SERVER["DOCUMENT_ROOT"]). "/db_hweb_inc/lockFolder"; 

//Check if script is already running 
if(!is_dir($lockfile)) { 
    // no lock present, so place one 
    register_shutdown_function('unlock', &$log); 
    mkdir($lockfile); 

    require "NotORM/NotORM.php"; 
    //...// require some other files 

    //MYSQL connect 
    $dsn = "mysql:dbname=" . $dbName; 
    $pdo = new PDO($dsn, $user, $pwd); 
    $db = new NotORM($pdo); 

    //...// Do something 
} 
else { 
    echo "locked"; 
    $log->logInfo("## Cron: end (locked) ##"); 
} 

function unlock(&$log) { 
    $log->logInfo("## Cron: end ##"); 
    // remove the lock 
    rmdir(realpath($_SERVER["DOCUMENT_ROOT"]). "/db_hweb_inc/lockFolder"); 
} 

로그 파일은 일반적으로 다음과 같습니다 : 여기

짧은 스크립트의 버전입니다

:

2013-07-09 15:18:01 - INFO --> ++ Cron started ++ 
2013-07-09 15:18:01 - INFO --> ## Cron end ## 
2013-07-09 15:19:01 - INFO --> ++ Cron started ++ 
2013-07-09 15:19:01 - INFO --> ## Cron end ## 
2013-07-09 15:20:01 - INFO --> ++ Cron started ++ 
2013-07-09 15:20:01 - INFO --> ## Cron end ## 

그러나 문제는 로그 파일은 다음과 같습니다 발생하는 경우

2013-07-09 15:28:54 - INFO --> ++ Cron started ++ 
2013-07-09 15:28:54 - INFO --> ## Cron end ## 
2013-07-09 15:30:29 - INFO --> ++ Cron started ++ 
2013-07-09 15:30:29 - INFO --> ## Cron end ## 
2013-07-09 15:30:57 - INFO --> ++ Cron started ++ 
2013-07-09 15:30:57 - INFO --> ## Cron end ## 

런타임은 정상이지만 cronjob은 비정상적인 시간에 스크립트를 실행합니다 ...

그래서이 스크립트가 전체 서버를 차단하는 방식으로 가능합니까? 차단이란 예를 들어 http 요청은 오래 걸리고 실패합니다. 차단 문제는 임의로 발생합니다. 이 스크립트는 unusuall 시간에 시작되지

답변

0

하지만 그 명령이 실행 된 후

if(file_get_contents("db_hweb_inc/lock.txt") == "unlocked") { 
    // no lock present, so place one 
    register_shutdown_function('unlock'); 
    file_put_contents("db_hweb_inc/lock.txt", "locked"); 

그래서 당신의 로그 항목이 발생이 코드 아래에 loggin에 있습니다. 이러한 명령을 실행하는 데 시간이 오래 걸리면 지연된 항목이 표시됩니다. 서버 관리자가 서버를 차단하면 디스크 I/O에 대해 이야기해야합니다. 당신의 읽기 및 쓰기가 큰 파일 일 수 있기 때문입니다. 이 명령 위에 시작 loggin 항목을 넣으십시오.

+0

감사합니다. 나는이 명령 위에 loggin 코드를 놓을 것이다. 하지만 첫 번째 줄은 "unlocked"또는 "locked"문자열이있는 단순한 txt 파일을 사용하여 스크립트가 이미 실행되고 있는지 테스트합니다. 그래서 나는이 라인들이 문제를 일으킬 것이라고 생각하지 않는다. –

+0

파일 준비가되어있는 무거운 디스크가 있으면 언젠가는 걸릴 수 있습니다. 거기에 디스크에 무거운 다른 프로세스가있을 수 있습니다. 항상 자물쇠 용 디렉토리를 사용하는 것이 좋습니다. 현재 잠금 설정에 너무 많은 오버 헤드가 있습니다. 'is_dir ($ lockfile)'// 잠금이 있는지 확인하십시오. 'mkdir ($ lockfile)'// 잠금을 만듭니다 '잠금 해제 ($ lockfile)'// 잠금을 제거하십시오 – DevZer0

+0

고마워요! 나는 이것을 바꿨다. 그러나 이것이 문제를 일으킨다 고 나는 생각하지 않습니다. 주요 작업은 NOTORM과 함께 MySQL 데이터베이스를 사용하기 때문에 문제가 없어야합니다. 스크립트로 인해 문제가 발생할 가능성이 아직 있습니까? 런타임이 괜찮은 경우에도? 문제는이 스크립트로 인해 발생하지 않는다고 생각합니다 ... –

관련 문제