ob_flush()
과 의 차이점은 무엇 flush()
이며 왜 둘 다 전화해야합니까?
ob_flush()
참조 말한다 :
이 함수는 출력 버퍼 (있는 경우)의 내용을 보냅니다.
flush()
참조 말한다 :
PHP의 쓰기 버퍼와 PHP가 사용하는 모든 백엔드 (CGI, 웹 서버 등)를 플러시합니다.
그러나 계속해서 다음과 같이 말합니다.
[it] 웹 서버의 버퍼링 스키마를 무시하지 못할 수 있습니다…
그래서 나는 ob_flush()
항상 사용할 수 있다고 생각합니다 . 그러나 그렇게하면 이상한 결과가 나옵니다. 누군가 여기서 무슨 일이 일어나고 있는지 간단한 용어로 설명 할 수 있습니까?
답변
ob_flush
응용 프로그램에서 시작된 버퍼를 보냅니다. ob_start()
PHP 스크립트 에는 여러 개의 중첩이있을 수 있습니다 . ob_flush
현재 콘텐츠를 상위 레이어로 전달합니다.
PHP 자체는 (자체 재량에 따라) 버퍼 출력을 할 수 있습니다. 이것은 백엔드에 따라 다릅니다. 그러나 일반적으로 FastCGI
자체 소켓 버퍼가 있습니다. 따라서 flush()
현재 콘텐츠를 웹 서버로 보내기 위해 호출해야합니다.
그리고 이제 웹 서버는 mod_deflate
사용자가 영향을 미치지 않는 다른 버퍼링 체계 ( 또는 콘텐츠 필터)를 자체적으로 구현할 수 있습니다 . 그러나 이것은 특별히 구성해야하므로 거의 발생하지 않습니다.
어쨌든 둘 다 사용하십시오.
답변
ob_flush
다음 과 같은 함수로 만든 출력 버퍼 를 플러시합니다.ob_start
flush
PHP 스크립트 자체의 버퍼링 된 출력을 호출자에게 플러시합니다.
답변
ob_flush()
높은 수준의 플러시입니다. 높은 수준의 버퍼를 플러시하고 모든 콘텐츠를 보낼 준비가 된 낮은 수준의 내부 버퍼에 넣습니다.
- 것을 주
ob_
기능의 가족이 만드는 스택 , 그래서 그냥 맹목적으로 쓰기 버퍼를ob_flush()
어디서나 실제로 코드가이 스택을 활용 작성된 경우 “이상한 결과”를 제공하는 것입니다.
flush()
낮은 수준의 플러시로 PHP가 내부의 낮은 수준의 데이터 버퍼를 플러시하도록 지시합니다.
그 아래에는 소켓 계층 버퍼가 있습니다. 그 아래에는 네트워크 계층 버퍼가 있습니다. 그리고 가장 낮은 수준에서 데이터 케이블을 따라 내려가는 전자의 대기열입니다.
답변
나는 이것이 이전 질문 과 관련이 있다고 생각합니다 . 출력 버퍼링 사용의 중요한 이점은 데이터 압축과 함께 사용할 때입니다. 을 사용하지 않으면 ob_gzhandler
얻을 것이 거의 없습니다 . flush
단독으로 서버에있는 출력 데이터를 커밋합니다. 으로 ob_start
그 대응 ob_flush
, ob_end_clean
그리고 ob_end_flush
, 어떤 압축을 기다리고 있습니다 (봐 flush
와 ob_flush
다른 버킷을 참조로 – ob
에 데이터를 전송 flush
, flush
브라우저에 데이터를 전송 – 정확하지만 그건 생각하지 않을 수 있습니다) 싸서 클라이언트로 전송됩니다 .