2009-09-04 3 views
1

나는 이것이 약간 일반적인 것을 알고 있지만 당신이 나의 설명을 이해할 것이라고 확신한다. 상황은 다음과 같습니다.하드웨어 오류가 발생한 후이 스크립트를 어떻게 복원합니까?


다음 코드는 10 분마다 실행됩니다. 변수 "var_x"는 외부 텍스트 파일을 참조 할 때 항상 읽거나 쓰게됩니다.

if (var_x != 1) 
{ 
    var_x = 1; 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    var_x = 0; 
} 
else 
{ 
    // exit script as it's already running. 
} 

문제는 : 다음 주 스크립트 로직을 다시 실행하지 않습니다 하드웨어 오류 (스크립트가 실행되어 하드 리셋을)를 시뮬레이션하는 경우 때문에 "var_x는"항상 "1"이됩니다 . (이미 복원 지점을 해결하는 논리가 있습니다.)

감사합니다.

+0

어떤 이유에서 무리가 나를 위해 작동하지 않는 것 같습니다. Flock은 파일이 자유롭게 될 때까지 코드를 지연시키는 것처럼 보입니다. 원하는 것이 아닙니다. – Cheetah

답변

6

잠해야하며 flock을 가진 파일의 잠금을 해제 (리셋이 발생하면 파일 잠금도 초기화됩니다) Windows 컴퓨터에서 올바르게 작동하려면 다른 솔루션을 사용해야합니다. 머리 위로 가능한 해결책에 대한 아이디어 :

var_x에 1을 쓰는 대신 getmypid을 통해 검색된 프로세스 ID를 작성하십시오. 스크립트의 새로운 인스턴스가 파일을 읽을 때이 ID로 실행중인 프로세스를 찾은 다음 프로세스가 PHP 스크립트인지 확인해야합니다. 물론, 이것은 여전히 ​​잘못 될 수 있습니다. 다른 PHP 스크립트가 하드웨어 오류 후에 동일한 PID를 얻을 가능성이 있기 때문에 솔루션은 최적이 아닙니다.

+0

귀하의 노력에 대해 – Dooltaz

+0

다른 +1. 노력 동반자 주셔서 감사합니다. – Cheetah

+0

투표 할 수 없습니다 :(담당자가 충분하지 않습니다.) – Cheetah

0

프로세스 관리를 위해 일종의 수동 세마포어를 사용하는 것 같습니다.

파일에 쓰는 대신 아마도 environment variable을 사용해야합니다. 이렇게하면 실패 할 경우 복원 할 때 스크립트에 닫힌 세마포가 없습니다.

+0

PHP.net :'경고 : 이러한 지시어는 안전 모드 자체가 활성화되었을 때만 효과가 있습니다! – scragar

+0

사실, scragar의 대답은 PHP에서 훨씬 낫습니다. 나는 단지 일반적으로 생각하고 있었다. –

5

파일 잠금을 사용하면 더 잘 해결할 수 있다고 생각하지 않습니까?

$fp = fopen($your_file); 
if (flock($fp, LOCK_EX)) {) 
{ 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    flock($fp, LOCK_UN); 
} 
else 
{ 
    // exit script as it's already running. 
} 

편집 : 무리로

이없는 것 같다

http://php.net/flock

+0

내 머리 꼭대기에서 (생각하면) - 완벽 해. – Cheetah

+0

내가 코드를 작성하는 동안 당신이 나를 때려;) – Residuum

관련 문제