2016-10-10 3 views
2

새로운 요청이 발생하면 긴 폴링을 사용하고 AJAX 호출로 시작된 스크립트를 중지하려고합니다. 나는 동일한 스크립트를 실행하는 경우 (이이 $_SESSION['checker'] 변수를 변경해야한다) 그래서,

$checker = $_SESSION['checker'] = time(); 

while (true) { 
    if ($checker != $_SESSION['checker']) { 
      $out = 'new one started'; 
      break; 
    } 

    if (some other condition) { 
      $out = 'smth done or happend'; 
      break; 
    } 

    sleep(3); 
} 

echo $out; 

내가 몇 가지 기록을하고있다 및 $_SESSION['checker']가 업데이트되지 않은 것 같습니다 : 이것은 AJAX 요청에 의해 시작되는 PHP 코드 , 이전에 시작된 스크립트의 while 루프는 여전히 이전 $_SESSION['checker']을 볼 수 있습니다. 업데이트되지 않는 이유는 무엇입니까?

+1

'그 모든 것이 의미가 있기를 바랍니다.'나는 의심 스럽습니다. –

+0

안녕하세요, 질문을 명확히 해주시겠습니까? – brclz

+0

PHP를 통하지 않고 아약스 부분으로 파기해야한다고 생각합니다. 현재 httprequest에서 .abort()를 시도하여 중지하고 다른 것을 시작하십시오. –

답변

3

PHP 세션은 기본적으로 동시 읽기/쓰기 작업을 지원하지 않습니다. 즉, 하나의 요청에서 $ _SESSION 배열을 업데이트하면 이미 PHP 요청을 실행중인 으로 전파되지 않습니다.

해결 방법은 파일을 만들고 해당 파일의 filemtime (파일 수정 시간)을 모니터링하는 것입니다. 파일이 업데이트 된 것을 볼 때마다 다른 프로세스 touch이 실행되었음을 알게됩니다.

구현 예 : 첫 번째 프로세스가 while 루프 내부의 코드가 너무 오래 걸리지 않을 것을 의미 종료해야 얼마나 빨리에 따라 자주 변경 내용을 테스트해야합니다

$filename = ".test_file"; 

// Update the file modification time to the current time 
touch($filename); 
$modificationTime = filemtime($filename); 

while ($modificationTime === filemtime($filename) { 
    // Do stuff, file modification time is not yet updated. 
} 

// The file modification time has been updated! 

참고.

+0

파일의 filemtime 검사가 늦어지는 문제가 있습니까? 다른 프로세스가 이미 실행 중이고 작업 중이기 때문에 다른 프로세스를 방해 할 수 있습니까? –

+0

다른 프로세스가 시작 되 자마자 프로세스를 중지해야합니다. 이 스크립트는 그렇게하지만 모든 'while'동안 만 수행합니다. 잠시 동안의 과정에 몇 초가 걸리면 두 번째 아약스 호출이 시작된 후 첫 번째 호출이 중지되기까지 몇 초가 걸릴 것입니다. 이것은 첫 번째 호출이 중지되기 전에 두 호출이 작은 시간 동안 실행됨을 의미 할 수 있습니다. 이것은 잠재적으로 개발자의 희망에 따라 문제가 될 수 있습니다. –

+0

어떻게 파일을 변경합니까? 이미 실행중인 하나의 작업 (중지하려는 작업)이 있습니다. 캐치 종류 22 :) – user3195616

1

PHP 측 대신 에이잭스 측에서 처리 할 수 ​​있습니다. 다음과 같이 중단을 통해 현재 HTTP 요청을 중단 할 수 있습니다.

var xhr = $.ajax({ 
    type: "POST", 
    url: "file.php", 
    data: "parameter=input&type=test", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    } 
}); 

//kill the request 
xhr.abort() 
+0

실제로 PHP 프로세스가 종료됩니까? – Pete

+0

좋은 질문, 나는 그렇게 생각하지 않는다. * 주목할 점은 abort()가 브라우저의 관점에서 요청을 취소하지만, 요청이 이미 서버에 성공적으로 전송 되었다면 서버는 여전히 모든 것을 처리한다는 것이다. 브라우저는 단순히 서버가 보낸 모든 데이터/응답에 응답 할 것입니다. '* –

+0

PHP 프로세스, PHP 스크립트가 서버에서 계속 실행되지 않고 브라우저가 청취하지 않습니다. – user3195616

관련 문제