나는 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 시간에 시작되지
감사합니다. 나는이 명령 위에 loggin 코드를 놓을 것이다. 하지만 첫 번째 줄은 "unlocked"또는 "locked"문자열이있는 단순한 txt 파일을 사용하여 스크립트가 이미 실행되고 있는지 테스트합니다. 그래서 나는이 라인들이 문제를 일으킬 것이라고 생각하지 않는다. –
파일 준비가되어있는 무거운 디스크가 있으면 언젠가는 걸릴 수 있습니다. 거기에 디스크에 무거운 다른 프로세스가있을 수 있습니다. 항상 자물쇠 용 디렉토리를 사용하는 것이 좋습니다. 현재 잠금 설정에 너무 많은 오버 헤드가 있습니다. 'is_dir ($ lockfile)'// 잠금이 있는지 확인하십시오. 'mkdir ($ lockfile)'// 잠금을 만듭니다 '잠금 해제 ($ lockfile)'// 잠금을 제거하십시오 – DevZer0
고마워요! 나는 이것을 바꿨다. 그러나 이것이 문제를 일으킨다 고 나는 생각하지 않습니다. 주요 작업은 NOTORM과 함께 MySQL 데이터베이스를 사용하기 때문에 문제가 없어야합니다. 스크립트로 인해 문제가 발생할 가능성이 아직 있습니까? 런타임이 괜찮은 경우에도? 문제는이 스크립트로 인해 발생하지 않는다고 생각합니다 ... –