이 http 서버의 문제입니까?

이 http 서버의 문제입니까?
<?php
    ob_start();
    echo 'test';
    ob_end_flush();
    flush();
    sleep(10);

연결이 끝나기 전에 ajax 요청에 대한 응답을 출력하려고 했지만 작동하지 않습니다. 응답을 성공적으로 가져오기 전에 10초를 기다립니다. 제 경우에는 Apache의 문제입니까?그게 사실이라면 어떻게 해결합니까? 응답을 바로 다시 반향한다고요?

답변1

flush(), ob_end_flush()및 는 ob_flush()출력이 서버로 전송되도록 보장하지만 PHP는 때때로 특정 소프트웨어 구성을 그다지 허용하지 않는다는 것을 발견했습니다 .

특히 Windows에서 출력 버퍼링은 설정하기 어려울 수 있으며 시스템 간에 안정적으로 작동하는 유일한 방법은 플러시할 때마다 출력 버퍼링을 다음과 같이 재설정하는 것입니다.

<?php
obf_start();

for($i=0;$i<70;$i++) {
    echo 'printing... ', microtime(true), '<br />';

    if($i % 3 == 2) obf_flush();

    usleep(300000);
}

function obf_start() {
    ob_start();
}

function obf_flush() {
    ob_end_flush();
    ob_flush();
    flush();
    obf_start();
}

추악한 해결책입니까? 그렇습니다. 하지만 그때까지출력 버퍼링과 관련된 모든 버그수정되었으므로 이 해결 방법이 프로덕션 코드에서 곧 사라지지는 않을 것입니다.

또한 일부 바이러스 백신 소프트웨어(Panda AV 및 기타)와 프록시는 소켓이 닫힐 때까지 모든 데이터를 보관합니다. 모든 클라이언트가 적절하게 플러시된 데이터를 수신한다고 보장할 수는 없습니다.

답변2

서버 문제인지 브라우저/라이브러리 문제인지 확인하는 가장 간단한 방법은 요청을 실시간으로 모니터링하는 것입니다. 귀하의 경우 이를 수행하는 가장 간단한 두 가지 방법은 다음과 같습니다.

  • 개똥 벌레: 이 Firefox 확장 프로그램은 모든 AJAX 요청이 전송되는 즉시 실시간으로 표시되며, 브라우저에서 요청을 수신하자마자 응답을 표시합니다.
  • 트래픽 캡처: Wireshark와 같은 도구를 사용하여 전송되는 모든 유형의 요청과 서버에서 돌아오는 TCP 트래픽을 실시간으로 확인합니다.

데이터가 즉시 돌아오지만 표시하는 데 10초가 걸리는 경우 브라우저나 AJAX 라이브러리가 응답을 처리하기 전에 연결이 닫힐 때까지 기다리고 있는 것입니다. 아무것도 돌려받기까지 10초가 걸린다면 서버나 PHP 모듈에 결함이 있는 것입니다.

관련 정보