2012-02-29 3 views
-1
나는 PHP 스크립트에 다음 코드를 사용하고 있어요

:PHP 시도/catch 문은 다른 탭에서 작동하지 않는/같은 브라우저

try{ 
    if(file_exists($dir."pid.txt"))throw new Exception("Process is already running"); 
} 
catch(Exception $e){ 
    die("Warning: ".$e->getMessage()." in ".$e->getFile()." on line ".$e->getLine()); 
} 

touch($dir."pid.txt"); 
sleep(20); // Just for a proof of concept 

기본적으로 어떤 스크립트가 수행하는 것은 :

경우 파일 $dir."pid.txt" - $dir에 올바른 권한이있는 디렉토리가있는 경우 - 이미 존재하는 경우 스크립트를 종료하십시오. 그렇지 않은 경우 pid.txt 파일을 만들고 20 초 동안 절전 모드로 전환하십시오.

의도 한 효과는이 스크립트가 두 번 액세스되는 것을 방지하는 것입니다.

한 탭에서 스크립트를 열고 20 초 내에 다른 탭에서 다시 시도하면 두 번째 탭의 스크립트가 죽지 않습니다. 그러나 브라우저마다 다른 탭이 작동합니다. 나는 크롬, 파이어 폭스, 그리고 IE, 최신 안정 버전으로 노력 해왔다.

"pid.txt"파일이 첫 번째 스크립트에서 올바르게 생성되었는지 100 % 확신합니다.

은 내가

if(file_exists($dir."pid.txt"))die("The process is already running"); 

이 작업을 수행 할 경우 때문에이 시도/catch 문 함께 할 수있는 뭔가가 생각한다. 그러나 이것은 많은 가능한 오류 중 하나이며이를 try/catch 문으로 그룹화하려고합니다. 그래서 나는이 마지막 접근법을 계속하고 싶지 않습니다.

아이디어가 있으십니까?

+0

여기서'$ dir'을 정의합니까? – Vytautas

+0

@Vytautas : $ dir은 이전 줄에 정의되어 있으며 $ dir = $ _SERVER [ "DOCUMENT_ROOT"]와 같습니다. "/ path/to/dir /"; – delolmo

+0

나는 PHP가 브라우저 탭에 신경 쓰지 않는다는 것을 확신 할 수있다. :) 두 가지 요청에 대해 다른 점이 무엇인지 또는 논리에 문제가 있는지 파악하십시오. – deceze

답변

0

@Yaniro가 언급했듯이 스크립트가 의도 한대로 작동하고 정의에 따라 플러시되도록 no-cache 헤더를 추가해야합니다. 최종 코드는 것이다 :

header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); 
header("Expires: Sat, 26 Jul 1970 05:00:00 GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
flush(); 

try{ 
    if(file_exists($dir."pid.txt"))throw new Exception("Process is already running"); 
} 
catch(Exception $e){ 
    die("Warning: ".$e->getMessage()." in ".$e->getFile()." on line ".$e->getLine()); 
} 

touch($dir."pid.txt"); 
sleep(20); // Just for a proof of concept 

flush()가 필요한 스크립트 (따라서 코드의 목적은 스크립트의 병렬 실행을 방지) 마무리가 너무 오래 걸리면.

0

코드는 $dir."pid.txt"이 아닌 것으로 판단하지 않는 한 정상적으로 작동합니다. 아니면 다른 곳에서 실수를 저질렀습니다. 더 유용한 답변을 원한다면 더 많은 코드를 제공하십시오.