2009-11-23 3 views
2

나는 PHP 스크립트 파일에 대해 여러 부분으로 질문을했습니다. 매초마다 데이터베이스를 업데이트하는이 파일을 만듭니다. 다른 모델링 방법은 없으며 매 초마다 수행해야합니다.PHP 루프 cronjob 역할 [하나의 인스턴스가 실행되도록]

이제 CentOS를 실행 중이며 새로 도입되었습니다. 첫 번째 멍청한 질문은 다음과 같습니다.

어떻게 SSH를 통해 PHP 파일을 실행합니까? 나는 단지 # php path-to/myfile.php라고 읽었다. 그러나 나는 뭔가를 울리려고했는데, 나는 그것을 텍스트에서 보지 못했다.

이제 파일 시작이 문제가 될 것이라고 생각하지 않습니다. 내가 할 수있는 한 가지 문제는 그것이 가능할 지 모르지만 여기에 있습니다.

파일이 한 번만 실행된다는 것을 100 % 확신 할 수 있습니까? 실수로 파일을 다시 실행하면 어떻게됩니까?

매초마다 로그에 쓰기를 구현하면 모든 것이 잘 돌아가는지 알 수 있습니다. 오류나 잘못된 것이 있으면 로그 파일이 중지됩니다.

fopen을 사용하여 로그 파일에 쓰고 쓰고 닫습니다. 이것은 시간이 많이 걸릴 것인가, CentOS에서 더 쉬운 방법이 아닌가?

또 다른 중요한 점은 내가 파일을 실행할 때 어떻게되는지입니다. 파일이 메모리에서 실행되었거나 시스템의 파일을 사용하고 있습니까? 파일의 변경 내용 (예 : 스크립트 실행을 중지)에 응답합니까?

파일 자체에 일종의 중지 메커니즘을 구현할 수 있습니까? 또는 파일을 중지하는 데 사용할 수있는 명령이 있습니까?

내가 아는 또 다른 옵션은 매분 실행되는 cronjob을 구현하는 것입니다. 그리고이 cronjob은 php 파일을 실행합니다. php 파일은 1 분 동안 반복되며 필요한 모든 것을 업데이트하고 종료됩니다. 이 방법을 구현했지만 브라우저를 사용했습니다. 방금 mu 파일을 열어 보았습니다. 브라우저가 잠시 바쁜 것을 보았지만 데이터베이스에서 아무 것도 업데이트하지 않았습니다. 누구나 이것이 어떤 이유인지 알 수 있습니까?

내가 가지고있는 또 다른 질문은 cronjob 메서드를 구현하는 것입니다. PLESK 패널에 채우는 명령은 무엇입니까? 위의 명령과 같습니다. 그냥 PHP와 파일 이름. 또는 -f -q -something과 같은 특수 명령이 있습니까?

모든 멍청한 질문에 대해 죄송합니다.

누군가가 나를 도와 주면 정말 감사하겠습니다.

Ciao!

+2

질문을 별도의 항목으로 구분할 수 있습니다. –

+0

Darrell과 동의하십시오. 단 하나 문제점 또는 질문 당 Stciking는 유용한 응답을 얻게 확률이 높습니다. – cletus

답변

8

실행중인 스크립트의 복사본을 하나만 만드는 가장 간단한 방법은 flock()을 사용하여 파일 잠금을 얻는 것입니다.예를 들어 스크립트가 시작시 잠금을 획득하려고 할 경우

<?php 

$fp = fopen("/tmp/lock.txt", "r+"); 

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    ftruncate($fp, 0); // truncate file 
    fwrite($fp, "Write something here\n"); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't get the lock!"; 
} 

fclose($fp); 

?> 

그래서 기본적으로는 설정 더미 파일이있을 것이다. 성공하면 실행됩니다. 그렇지 않은 경우 종료됩니다. 그렇게하면 한 번에 하나의 스크립트 사본 만 실행될 수 있습니다.

참고 :flock() 당신이 그것을 사용하는 경우에만 작동 의미 자문 잠금 방법이라고하는 것이다. 이렇게하면 여러 번 스크립트를 실행하지 못하게되지만 다른 스크립트에서는 아무 것도하지 않으므로 상황에 따라 괜찮습니다.

+1

실제로 이것을 사용해 보았지만 인스턴스가 나를 잡았습니다. 그것은 다음과 같이됩니다 : 스크립트를 실행하면 파일 잠금이 이제 해당 작업으로 넘어 가서 갑자기 cronjob이 중지되고 실패한 데이터로드로 데이터베이스에서 쿼리 할 수 ​​있습니다. 이제 잠금 파일은 여전히 ​​잠겨 있으며 해제되지 않습니다. 이렇게하면 스크립트가 실행되지 않습니다. 그런 상황을 어떻게 처리합니까? – oneofakind

2

이전 답변에 대한 설명에 명시된 바와 같이 스크립트 자체 내에서 항상 잠금에 의존 할 수는 없습니다. 이것은 해결책 일 수 있습니다.

#Mins Hours Days Months Day of week 
    *  *  *  *  * lockfile -r 0 /tmp/the.lock; php parse_tweets.php; rm -f /tmp/the.lock 
    *  *  *  *  * lockfile -r 0 /tmp/the.lock; php php get_tweets.php; rm -f /tmp/the.lock 

이렇게하면 스크립트가 충돌하더라도 잠금 파일이 해제됩니다. 여기에서 가져온 것 : https://unix.stackexchange.com/a/158459

+1

'lockfile '은 반드시 주어진 시스템에 존재할 필요는 없습니다. 그렇지 않다면'procmail' 패키지를 설치해야합니다. –