2012-05-28 4 views
3

셸 명령을 사용하여이 프로세스가 지금 실행 중인지 여부를 결정하는 PHP 코드를 보았지만 잃어 버렸습니다. 이 일을하는 방법을 알려주시겠습니까?PHP 프로세스를 싱글 톤으로 실행하는 방법

아이디어는 PHP 파일을 만들고 php -f을 사용하여 cron 작업으로이 파일을 실행하는 것입니다. 스크립트의 실행 시간은 10 초가 될 수 있지만 10 분이 될 수도 있습니다. 이 크론을 1 분마다 한 번씩 실행하고, 분당 크론이 아직 실행 중인지 확인해야합니다. 새 크론을 멈추고 다른 하나를 완료하게하십시오.

셸 프로그래밍에 익숙하지 않아 도움이 필요합니다.

p.s아이디어는 무한한 PHP 프로세스를 배경으로하지 않고 데몬을 만드는 것입니다.

답변

2

가, 다음 코드는 괜찮 (가 경쟁 조건 일 수 있지만, 미세이 아마 매우 드문 cronjob를 할 수 있습니다) :

if (file_exists($lockfilename)) { 
    ... // lock is already taken 
} else { 
    if (!file_put_contents($lockfilename, $lockstring)) { 
     error("unable to write $lockfilename"); 
    } 
    $lock_taken = true; 
    ... // do what you have to do 
    if (!unlink($lockfilename)) { 
     warning("unable to unlink $lockfilename"); 
    } 
    $lock_taken = false; 
} 

전역 변수 $lock_taken이 있는지 확인하는 것이 유용 할 수 있습니다 실행이 정지 될 때마다 lockfile이 제거됩니다. $lockstring은 날짜 또는 유닉스 타임 스탬프 일 수 있습니다. 너무 오래되면 잠금을 제거하는 데 유용 할 수 있습니다 (그러나 filemtime()으로 충분할 수 있음). 당신이 절대적으로 경쟁 조건 위험을 감수 할 수없는 경우

, 당신은하지만,

if (!($lockfile = fopen($lockfilename, "x"))) { 
    ... // lock is already taken 
} else { 
    $lock_taken = true; 
    ... // write something to lockfile (optional) 
    fclose($lockfile); 
    ... // do what you have to do 
    if (!unlink($lockfilename)) { 
     warning("unable to unlink $lockfilename"); 
    } 
    $lock_taken = false; 
} 

같은 지역 파일 잠금이 단지 작품을 뭔가를해야합니다.

3

잠금 파일에 대해 독점적 인 비 블로킹 잠금을 획득해야합니다. 성공하면 프로세스가 실행중인 유일한 인스턴스이며 종료 할 때까지 잠금을 유지해야합니다. 잠금 획득에 성공하지 못하면 실행중인 인스턴스가 이미 있으며 종료해야합니다. 많은 목적을 위해

1

파일을 삭제하기 전에 스크립트가 충돌하면 잠금이 계속 유지되므로 '파일이 있는지 확인'보다 독점적 인 파일 잠금 방법이 더 좋습니다. 시스템이 자동으로 스크립트 실행 후 잠금을 해제하기 때문에

//Allow only one instance 
$fileHandler = fopen('file_lock.lock', 'w'); 
$hasLock = flock($fileHandler, LOCK_EX | LOCK_NB); 
if (!$hasLock) 
    die("Another instance is already running"); 

//do work 

//release lock 
flock($fileHandler, LOCK_UN); 
fclose($fileHandler); 

릴리스 잠금 블록은 선택 사항입니다 : 여기

파일 잠금 코드입니다.

관련 문제