2012-05-03 4 views
3

나는 cron을 통해 실행할 PHP 스크립트를 작성 중입니다. 그것의 임무는 다른 PHP 스크립트를 호출하는 것입니다. 호출 된 스크립트는 외부에서 실행할 수도 있습니다. 내가 원한 것은 하나의 파일이 실행되는 동안 동시에 실행되지 않아야한다는 것입니다. 다음을 고려해보십시오.PHP에서 PID를 찾는 방법

두 개의 다른 스크립트 script1.php와 script2.php를 차례로 호출하는 하나의 스크립트 master.php가 있다고 가정합니다. 이제 script1.php를 호출하면 실행을 시작하고 10 분이 지나면 처리가 끝납니다. 이 Script1.php는이 10 분 동안 사용자가 별도로 실행할 수도 있습니다.

내가하고 싶은 것은이 스크립트가 처리 중에있는 동안 병렬로만 실행하면 안된다는 것입니다.

이 방법이 있습니까? (아마 script1.php의 PID를 체크함으로써).

고지.

답변

4

이것은 내가 pid 파일로 수행하는 방법입니다.

$pid_file = '/var/run/script1.pid'; 
if (file_exists($pid_file)) { 
     $pid = file_get_contents($pid_file); 
     if ($pid && file_exists('/proc/' . $pid)) { 
       $time = filemtime($pid_file); 
       if (time() - $time > 300) { 
         posix_kill($pid, 9); 
       } else { 
        exit("Another instance of {$argv[0]} is running.\n"); 
       } 
     } 
} 

$pid = posix_getpid(); 
if (!file_put_contents($pid_file, $pid)) exit("Can't write pid file $pid_file.\n"); 

을 그리고 스크립트의 끝에서 PID 파일을 해제 : 스크립트가 300 개 이상의 초 동안 실행되고 또한 경우 살해 될 것입니다 당신이를 실행하려는 경우

unlink($pid_file); 

첫 번째 인스턴스가 완료되면 스크립트 - exit()를 sleep (1)로 바꾸고 전체 블록을 루프에 넣습니다.

3

스크립트가 시작되면 잠금 파일이 있는지 확인하십시오. 그렇지 않은 경우 생성하십시오. 다른 세션이 실행 중일 때 다음에 스크립트가 시작되면 잠금 파일이 존재하기 때문에 스크립트가 종료됩니다. 스크립트가 끝나면 잠금 파일을 제거하십시오.

+0

큰 도움이됩니다. 감사합니다 :) – Deepak

0

임시 파일, 파이프, 공유 메모리 또는 상위 스크립트에 직접 script1의 pid를 저장할 수 있습니다. getmypid()를 사용하여 PHP 프로세스에서 PID를 가져올 수 있습니다.

0

일단 스크립트를 시작하면 "Script1.txt"라는 텍스트 파일을 만들고 스크립트의 끝에 파일을 삭제하십시오.

예를 들어 Script1.php의 첫 번째 줄에서 실제 스크립트가 실행되기 전에 해당 파일의 존재 여부를 확인하십시오. 스크립트가 이미 존재한다면 스크립트가 이미 실행 중임을 알 수 있습니다.

+0

그리고 스크립트가 오류/시간 초과/다른 이유로 인해 조기에 종료 될 때 수행 할 작업은 무엇입니까? 잠금 파일로 끝나고 스크립트가 다시 시작되지 않습니다. – strkol

+0

아마 예외를 사용합니까? – Ahatius

-1

나는 실행이 완료 될 때까지 exec이 기다리는 것으로 믿습니다. 그래서 master.php는 다음과 같습니다.

exec ("/ path/to/php script1.php");
exec ("/ path/to/php script2.php");

+0

인터프리터를 지정하지 않으면 PHP 스크립트가 시작되지 않습니다. 또한 누군가가 cron 작업 옆에서 스크립트를 시작하지 못하게합니다. – Ahatius

+0

당신 말이 맞아요. PHP 로의 경로는 exec에 접두어로 주어져야한다 (스크립트가'#!/path/to/php'로 시작하지 않는다면). 그리고 네, cron 작업 옆에서 스크립트를 시작할 수도 있습니다. 그럼에도 불구하고 가장 쉬운 해결책은 .. – bartlaarhoven

관련 문제