2017-09-13 8 views
1

현재 'sniffer.php'라는 단일 PHP 파일을 호출하려고합니다. JavaScript 파일을 사용하여 비동기로 작업하고 있습니다. 내가 현재 가지고있는 문제는 PHP 코드에서 무작위로 절전 기능을 추가 한 것입니다 (페이지가로드되는 것처럼 작동합니다). 그 문제는 두 개 이상의 함수가 페이지를 호출하여 페이지 중 하나가 먼저 완료된 다음 다른 요청이 중지 될 때까지 계속 기다립니다. EG : 5 초 동안 잠을 자고 다른 하나는 6 초 동안 잔다. 첫 번째 작업은 5 초 후에 완료되고 다음 작업은 11 초에 완료됩니다. 내가 찾고있는 것은 5 초 안에 완료되고 다음은 1 초 후에 완료된다는 것입니다. 문제가 발생하는 '잠자기'인지 또는 파일이 잠자기로 인해 잠겨 있는지 확실하지 않습니다.단일 파일에 대한 다중 HTTP 요청

도움/의견을 보내 주셔서 감사합니다.

내 PHP 파일은 다음과 같습니다

$c = rand(2,10); 
sleep($c); 
$html .= $c; 
echo json_encode(array('html'=>$html,'status'=>1)); 
exit; 

내 자바 스크립트 클래스는 다음과 같습니다

var path = '/'; 

var polling = { 
    add : function(name, obj) { 
     this[name] = new xAjax(obj); 
     return this; 
    } 
}; 

function xAjax(options) { 

    var consti = { 
    }; 
    var defaults = { 
     url: path + 'sniffer.php', 
     method: 'POST', 
     responseType: 'json', 
     async: true, 
     timeout: 30000, 
     success: function(response) {console.log(response);}, 
     done: function() {}, 
     beforeSend: function() {}, 
     error: function(e) {console.log(e);}, 
     abort: function() {} 
    }; 
    var settings = Object.assign({}, defaults, options, consti); 
    var xhr = null; 

    this.run = function() { 
     xhr = new XMLHttpRequest(); 

     settings.beforeSend(); 
     xhr.responseType = settings.responseType; 
     xhr.open(settings.method, settings.url, settings.async); 
     xhr.timeout = settings.timeout; 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == XMLHttpRequest.DONE) { 
       if (xhr.status === 200) { 
        settings.success(xhr.response); 
       } else { 
        settings.error(xhr.response); 
       } 
       settings.done(); 
       xhr = null; 
      } 
     }; 
     xhr.send(); 
     return this; 
    }; 

    this.abort = function() { 
     xhr.abort(); 
     xhr = null; 
     settings.abort(); 
     return this; 
    }; 

    this.isRunning = function() { 
     return xhr != null; 
    }; 

    this.set = function(options) { 
     settings = Object.assign({}, defaults, options, consti); 
     return this; 
    }; 
} 

내 생성 /를 sniffer.php에 전화 :

polling.add('x'); 
polling.x.run(); 
polling.add('y'); 
polling.y.run(); 
+1

PHP 세션은 동시 요청을 잠급니다. PHP 코드에서 세션을 시작했는지 확인하십시오. – jorgonor

+0

슬립은 현재 요청뿐만 아니라 현재 세션에 대한 실행을 지연시킵니다. – ADyson

+0

당신 말이 맞아요. 나는 세션을 시작했다. 나는 그것을 우회하는 방법이 없다고 가정합니다. 그것이 수면 (EG SQL 프로세스) 이외의 것이라면 여전히 세션 잠금이됩니까? – Deadweight

답변

1

이를 세션 때문에 발생합니다. 스크립트가 시간이 걸리는 경우 수면 유무와 관계없이 발생합니다.

세션을 시작할 때 어떤 일이 발생합니까? PHP는 세션 데이터가 최신이고 변경되지 않는다는 것을 확인해야하며 변경된 데이터가 다음 실행에서 사용 가능하도록해야합니다.

그래서 다른 곳에서 스크립트가 열려있는 동안 세션을 열려고하면 첫 번째 스크립트가 여전히 세션 정보를 변경하기 때문에 잠금이 있습니다. 첫 번째 스크립트가 세션을 닫으면 다음 스크립트가이를 기다리고 계속 진행할 수 있습니다.

session_write_close()으로 전화를 걸어 세션을 닫고 쓰기를 잠금으로써 잠금을 해제 할 수 있습니다. 세션이 닫혀있는 동안 계속해서 값에 액세스 할 수 있지만 후속 스크립트에서 아무 것도 변경하지 않는 경우 값이됩니다 (첫 번째 스크립트가 끝나기 전에 두 번째 스크립트가 변경된 경우 알 수 없음). 당신이 세션에 새로운 데이터를 작성하는 경우 또한, 그것은 ...

) 스크립트가 없이 session_write_close를 호출 할 필요가 (종료 후 세션 데이터는 일반적으로 저장 documentation

에서 저장되지 않습니다, 동시 데이터 쓰기를 방지하기 위해 세션 데이터가 잠겨 있으므로 세션 중 하나의 스크립트 만 언제든지 세션에서 작동 할 수 있습니다. 당신은 흥미로운 재미 거기에 수면 아무것도() 디버깅을 할 수 있습니다

경우 당신은 여전히 ​​활성 세션을 가지고 : 당신이하지 않는 유일한 사람처럼

또한 보인다. 예를 들어, ajax 요청을 작성하는 페이지. 여기서 ajax 요청은 서버 측 이벤트를 폴링하고 은 즉시 반환하지 않을 수 있습니다.

ajax 함수가 session_write_close()를 수행하지 않으면 바깥 쪽 페이지가 중단 된 것으로 나타나고 새 탭에서 다른 페이지를 열면 도 멈 춥니 다.

+0

이것은 많이 설명합니다. 감사합니다. – Deadweight