2012-08-05 2 views
0

한 번에 한 사용자가 액세스 할 수있는 PHP 페이지가 있습니다. 일종의 "가난한 사람의 cron": 백그라운드에서 요청되는 "Javascript"파일입니다. 순간 나는이 같은 잠금 파일 만드는 생각 해요 :PHP에서 잠금 파일은 얼마나 비쌉니까?

if(file_exists($lockfile) && filemtime($lockfile) + EXPIRES_AFTER > time()) { 
    die("// Page is locked."); 
} 

touch($lockfile); 
// do stuff 
unlink($lockfile); 
echo "// Cron stuff was run"; 

을하지만 file_exists 및 다른 페이지 요청을 할 수 있었던 touch 호출 사이 기회의 매우 짧은 창있을 수 있는지 확실하지 않습니다 파일 존재 여부를 확인하고 파일이 존재하지 않는지 확인하십시오. 우리는 아마도 여기에 마이크로 초를 말하고 있습니다. 그래서 제가 꼭 걱정해야 할 요청의 양을 알고 싶습니다.

+1

두 개의 요청이 동일한 정확한 시간에 충돌 할 가능성이 있다고 생각하지 않습니다. 응용 프로그램의 수명이 다가 오면 작은 큐를 사용하고 임의로 큐에있는 사람을 선택하여 서비스를 제공하십시오 파일. 그 외에는이 질문에 대답이 없다고 생각합니다. – Gntem

+1

@ GeoPhoenix : 기회가 있다고 생각하는 이유는 무엇입니까? 그리고 어떻게 같은 경주를 만들지 않고 무작위로 누군가를 선택할 수 있습니까? 대기열에 합류하는 사람과 새로운 대기열을 만드는 사람과 경쟁하십시오. –

+1

노출 창은 요청의 수에서 직접적으로 추론 할 수없는 것보다 시스템 부하의 함수입니다. 20 개의 많은 요청으로 1,000 개 이상의 사소한 요청을로드 할 수 있습니다. – tripleee

답변

1

코드에 경쟁 조건이 있습니다. 대신, dio_open O_EXCL 파일. 파일이 이미 있으면이 작업은 실패합니다. 완료되면 링크를 해제하십시오.

유일한주의 사항은 파일이 존재하는 동안 시스템이나 스크립트가 충돌하는 경우 스크립트가 다시 실행되지 않는 것입니다. 걱정이된다면 파일의 나이를 확인하십시오 (작성에 실패한 경우). 그리고 스크립트가 오래 걸릴 수있는 것보다 오래되면 링크를 해제하십시오.

flock을 사용하는 것이 다른 옵션입니다.

2

작성한 코드에는 원 자성이 없으므로 경쟁 조건이 있습니다.

1

실제로을 정확하게 수행하려면 수표와 자물쇠 사이에 시간이 있기 때문에 다른 방법을 사용하십시오.

두 가지 가능한 구현 :

  1. 사용 무리 : STM 같은 https://secure.php.net/manual/en/function.flock.php

  2. 사용 무언가 : 일예 append를 위해 lockfile을 열고, 그것에 무언가를 쓰고, 핸들을 닫는다. 그런 다음 파일을 다시 읽으십시오. 그러면 파일에 쓴 내용 만있는 경우 잠금을 획득하게됩니다.

이외의 원본 코드는 문제가되지 않을 것입니다.

관련 문제