2012-11-11 4 views
3

나는 그렇지 않으면PHP flock() 비 블로킹 여전히 블록 이유? 파일이 잠겨 있지 않은 경우

<?php  
$fp = fopen("/var/tmp/your.lock", "w"); 
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking 
    die("Another instance is running"); 
} 

//my script 
sleep(10); 
echo 'completed successfully'; 

을 중지 그래서 다음의 예를 확인해야 스크립트의 다른 인스턴스가 이미 임시 파일의 잠금을 획득하여 실행되고 있는지 확인하기 위해 무리() 함수를 사용하고 있습니다 스크립트는 다른 브라우저에서 동시에 두 번 파일을 호출 할 때 문제없이 작동합니다. 즉, 동일한 브라우저에서 두 인스턴스를 동시에 열었을 때 대기합니다. 즉, 첫 번째 호출은 잠금을 가져오고 두 번째 호출은 잠금을 닫고 닫지 않습니다.

파일이 인스턴스가 이미 작동하는지 확인하는 다른 방법이있을 수 있지만 그 중 대부분은 실행을 취소 한 다음 사용합니다 스크립트가 오랜 시간이 걸리거나 메모리 제한을 초과하거나 어떤 이유로 든 종료 할 수 있습니다.

어떤 도움이 필요합니까?

답변

6

문제였다

동일한 프로세스를 통해 스레드 기능 비 차단

기다려야 제 스크립트 유발 처리 층에서 작동) (무리 것이다 브라우저에서 동일한 URL 회 동일한 스크립트 호출 두 개의 요청이

example.com/test.php?rand=1 
example.com/test.php?rand=2 
같은 각각의 단일 요청에 대해 별도의 프로세스를 생성합니다 어떤 확률 변수를 추가 동일한 프로세스의 책략에 작동하게됩니다 두 번 example.com/test.php 를 호출하는 예로서

위대한 작품.

+0

많은 답변을 보았지만이 중 하나도 win7 wamp에서이 작업을 만들지 않았습니다! 고맙습니다! – JanBo

3

동일한 스크립트를 명령 줄에서 두 번 실행하십시오. 나는 그것이 잘 작동하는 걸 기꺼이 할 것입니다.

브라우저가 특정 호스트에 한 번에 하나의 연결 만 허용하여 서버에 대한 연결 속도를 제한 할 가능성이 있습니다. 서로 다른 브라우저에서 서로 다른 결과를 얻는다는 사실은 PHP가 문제가 아니라는 것을 나타냅니다. PHP가 페이지를 요청하는 브라우저와 상관없이 동일하게 수행하기 때문입니다.

+0

맞습니다. test.php? rand = 10 test.php? rand = 20과 같은 변수를 추가하려고 시도했지만 브라우저에서 훌륭하게 작동했습니다. 브라우저가 두 번째 요청을 차단하여 해결책이 var에서 다른 것을 전송하는 것 같습니다. – Atef