PHP flush()와 obflush()의 차이 상세 설명

5596 단어 PHPflushob flush
buffer ---- flush() buffer 는 메모리 주소 공간 입 니 다.Linux 시스템 의 기본 크기 는 보통 4096(1kb),즉 메모리 페이지 입 니 다.주로 저장 속도 가 동기 화 되 지 않 는 장치 나 우선 순위 가 다른 장치 간 에 데 이 터 를 전송 하 는 구역 에 사용 된다.buffer 를 통 해 프로 세 스 간 의 상호 기다 림 을 줄 일 수 있 습 니 다.여기 서 통속 적 인 예 를 들 어 텍스트 편집 기 를 열 어 파일 을 편집 할 때 한 문 자 를 입력 할 때마다 운영 체 제 는 이 문 자 를 디스크 에 직접 쓰 지 않 고 buffer 에 먼저 기록 합 니 다.buffer 에 가득 쓸 때 만 buffer 의 데 이 터 를 디스크 에 기록 합 니 다.물론 커 널 함수 flush()를 호출 할 때.버퍼 의 더러 운 데 이 터 를 디스크 에 다시 쓰 도록 강제 합 니 다.마찬가지 로 echo,print 를 실행 할 때 출력 은 tcp 를 통 해 클 라 이언 트 브 라 우 저 에 바로 보 여주 지 않 고 php buffer 에 데 이 터 를 기록 합 니 다.php output_buffering 메커니즘 은 tcp buffer 전에 새로운 대기 열 을 만 들 었 음 을 의미 합 니 다.데 이 터 는 반드시 이 대기 열 을 거 쳐 야 합 니 다.php buffer 가 가득 찼 을 때 스 크 립 트 프로 세 스 는 php buffer 의 출력 데 이 터 를 시스템 커 널 에 tcp 로 브 라 우 저 에 보 여 줍 니 다.따라서 데 이 터 는 이 몇 군데 에 순서대로 적 혀 있 습 니 다 echo/pring->phop buffer->tcp buffer->browser phop outputbuffering --- ob_flush()는 기본적으로 php buffer 가 열 려 있 고 이 buffer 의 기본 값 은 4096,즉 1kb 입 니 다.php.ini 프로필 에서 output 를 찾 을 수 있 습 니 다.buffering 설정.echo,print 등 사용자 데 이 터 를 출력 할 때 출력 데 이 터 는 php output 에 기 록 됩 니 다.buffering 중,output 까지buffering 이 가득 쓰 여 있 으 면 이 데 이 터 를 tcp 를 통 해 브 라 우 저 에 전송 합 니 다.너 도 obstart()php 출력 수 동 활성화buffering 메커니즘 은 1kb 이상 의 데 이 터 를 출력 하 더 라 도 tcp 에 데 이 터 를 브 라 우 저 에 전달 하지 않 습 니 다.왜냐하면 obstart()는 phop buffer 공간 을 충분히 설정 합 니 다.스 크 립 트 가 끝 날 때 까지 만 ob 호출end_flush 함수 만 클 라 이언 트 브 라 우 저 에 데 이 터 를 보 낼 수 있 습 니 다.
이 두 함수 의 사용 은 아마도 많은 사람들 이 가장 현혹 되 는 문제 일 것 이다.수첩 에서 두 함수 에 대한 해석 도 상세 하지 않 고 그들의 차 이 를 명확 하 게 지적 하지 않 았 다.마치 두 함수 의 기능 은 모두 출력 캐 시 를 새로 고 치 는 것 같다.그러나 우리 글 의 초기 코드 에서 fush()를 ob 로 바 꾸 면flush(),프로그램 이 더 이상 정확하게 실 행 될 수 없습니다.분명히 그것들 은 차이 가 있다.그렇지 않 으 면 수첩 에서 그 중 하나 가 다른 함수 의 별명 이라는 것 을 직접 설명 하면 된다.따로 설명 할 필요 가 없다.그렇다면 이들 의 차 이 는 무엇 일 까?캐 시 를 열지 않 았 을 때 스 크 립 트 출력 내용 은 서버 에서 출력 을 기다 리 는 상태 입 니 다.flush()는 출력 을 기다 리 는 내용 을 클 라 이언 트 에 즉시 보 낼 수 있 습 니 다.
캐 시 를 열 면 스 크 립 트 출력 내용 이 출력 캐 시 에 저 장 됩 니 다.이 때 출력 대기 상태 에 있 는 내용 이 없습니다.flush()를 직접 사용 하면 클 라 이언 트 에 아무런 내용 도 보 내지 않 습 니 다.그리고 obflush()의 역할 은 출력 캐 시 에 존재 하 는 내용 을 꺼 내 출력 대기 상태 로 설정 하지만 클 라 이언 트 에 직접 보 내지 않 습 니 다.이 럴 때 ob 를 먼저 사용 해 야 합 니 다.flush()를 다시 flush()를 사용 해 야 클 라 이언 트 가 스 크 립 트 의 출력 을 즉시 얻 을 수 있 습 니 다.
하나 flush 와 obflush 의 정확 한 순서,정확 한 것 은'선 ob'입 니 다.flush 재 flush,다음 과 같 음:obflush();flush();웹 서버 의 운영 체제 가 windows 시스템 이 라면 순 서 를 뒤 바 꾸 거나 ob 를 사용 하지 않 습 니 다.flush()도 문제 가 없 을 겁 니 다.인증 이 필요 합 니 다]하지만 Linux 시스템 에 서 는 출력 버퍼 를 새로 고 칠 수 없습니다.출력 버퍼 링 함수 1.bool obstart ([ callback $output_callback [, int $chunk_size[,bool$erase]]])출력 활성화buffering 메커니즘.활성화 되면 스 크 립 트 출력 은 브 라 우 저 에 직접 나 오지 않 고 phop buffer 메모리 영역 을 잠시 기록 합 니 다.php 기본 오픈 outputbuffering 메커니즘,단지 ob 호출 을 통 해start()함수 outputbuffering 값 이 충분 하 게 확장 되 었 습 니 다.$chunk 도 지정 할 수 있 습 니 다.size 로 output 지정buffering 의 값 입 니 다.$chunk_size 기본 값 은 0 입 니 다.스 크 립 트 가 실 행 될 때 까지 phop buffer 의 데 이 터 를 브 라 우 저 로 보 냅 니 다.만약 당신 이$chunk 를 설정 했다 면size 의 크기 는 buffer 의 데이터 길이 가 이 값 에 도달 하면 buffer 의 데 이 터 를 브 라 우 저 에 보 냅 니 다.물론$ouput 를 지정 할 수 있 습 니 다.callback,buffer 의 데 이 터 를 처리 합 니 다.예 를 들 어 함수 obgzhandler,buffer 의 데 이 터 를 압축 한 후 브 라 우 저 에 전송 합 니 다.세 번 째 인자:캐 시 를 지 울 지 여부 입 니 다.선택 할 수 있 습 니 다.기본 값 은 true 입 니 다.false 로 설정 하면 스 크 립 트 실행 이 끝 날 때 까지 캐 시 는 삭제 되 지 않 습 니 다.2.ob_get_contents 는 phop buffer 의 데이터 복사 본 을 가 져 옵 니 다.주의해 야 할 것 은,당신 은 ob 에 있 을 것 입 니 다.end_clean()함수 호출 전에 이 함 수 를 호출 합 니 다.그렇지 않 으 면 obget_contents()빈 문자 로 되 돌려 줍 니 다.ob 사용 가능get_contents()는 서버 캐 시 데 이 터 를 문자열 로 가 져 오고 ob 를 사용 합 니 다.end_flush()는 캐 시 된 데 이 터 를 출력 하고 캐 시 를 닫 습 니 다.ob 사용end_clean()은 데이터 나 다른 행동 없 이 서버 캐 시 데 이 터 를 조용히 삭제 합 니 다.서버 의 캐 시 는 쌓 여 있 습 니 다.즉,ob 를 열 고 있 습 니 다.start()후 닫 기 전에 내부 에 다른 캐 시 ob 를 열 수 있 습 니 다.start()。하지만 캐 시 를 닫 는 작업 과 캐 시 를 여 는 작업 이 똑 같이 많 음 을 보증 해 야 합 니 다.ob_start()는 캐 시 데 이 터 를 처리 하기 위해 반전 함 수 를 지정 할 수 있 습 니 다.만약 obstart()내부 에 다른 ob 가 내장 되 어 있 습 니 다.start(),우 리 는'외층 의 ob'라 고 가정 합 니 다.start(),번 호 는 A,내부 ob 입 니 다.start()번 호 는 B 입 니 다.각각 functionA 와 functionB 를 만 들 었 습 니 다.그러면 캐 시 B 의 데이터 출력 을 할 때 선배 funcitonB 반전 함수 로 처리 하고 외부 functionA 반전 함수 에 맡 겨 처리 한 후에 야 클 라 이언 트 에 출력 할 수 있 습 니 다.또한,매 뉴 얼 에 따 르 면 일부 웹 서버,예 를 들 어 apache 는 리 셋 함 수 를 사용 하면 프로그램의 현재 작업 디 렉 터 리 를 바 꿀 수 있 습 니 다.해결 방법 은 리 셋 함수 에서 자체 적 으로 작업 디 렉 터 리 를 수 동 으로 수정 하고 chdir 함수 로 수정 하 는 것 입 니 다.이 점 은 자주 만 나 지 않 는 것 같 습 니 다.만 났 을 때 매 뉴 얼 을 찾 아 보 세 요.3.ob_end_flush 와 obend_clean 이 두 함수 가 비슷 해서 ouptu 를 닫 습 니 다.buffering 메커니즘.하지만 다른 것 은 obend_flush 는 phop buffer 의 데 이 터 를 클 라 이언 트 브 라 우 저 에 충 전 했 을 뿐 obclean_clean 은 php bufeer 의 데 이 터 를 비우 지만 클 라 이언 트 브 라 우 저 에 보 내지 않 습 니 다.ob_end_flush 호출 전,phop buffer 의 데 이 터 는 여전히 존재 합 니 다.obget_contents()는 php buffer 의 데 이 터 를 복사 할 수 있 습 니 다.
그리고 obend_flush()호출 후 obget_contents()에서 가 져 온 것 은 빈 문자열 이 며,브 라 우 저 에서 도 출력 을 받 을 수 없습니다.즉,출력 이 없습니다.
ob 사용 가능get_contents()는 서버 캐 시 데 이 터 를 문자열 로 가 져 오고 ob 를 사용 합 니 다.end_flush()는 캐 시 된 데 이 터 를 출력 하고 캐 시 를 닫 습 니 다.ob 사용end_clean()은 데이터 나 다른 행동 없 이 서버 캐 시 데 이 터 를 조용히 삭제 합 니 다.서버 의 캐 시 는 쌓 여 있 습 니 다.즉,ob 를 열 고 있 습 니 다.start()후 닫 기 전에 내부 에 다른 캐 시 ob 를 열 수 있 습 니 다.start()。하지만 캐 시 를 닫 는 작업 과 캐 시 를 여 는 작업 이 똑 같이 많 음 을 보증 해 야 합 니 다.ob_start()는 캐 시 데 이 터 를 처리 하기 위해 반전 함 수 를 지정 할 수 있 습 니 다.만약 obstart()내부 에 다른 ob 가 내장 되 어 있 습 니 다.start(),우 리 는'외층 의 ob'라 고 가정 합 니 다.start(),번 호 는 A,내부 ob 입 니 다.start()번 호 는 B 입 니 다.각각 functionA 와 functionB 를 만 들 었 습 니 다.그러면 캐 시 B 의 데이터 출력 을 할 때 선배 funcitonB 반전 함수 로 처리 하고 외부 functionA 반전 함수 에 맡 겨 처리 한 후에 야 클 라 이언 트 에 출력 할 수 있 습 니 다.또한,매 뉴 얼 에 따 르 면 일부 웹 서버,예 를 들 어 apache 는 리 셋 함 수 를 사용 하면 프로그램의 현재 작업 디 렉 터 리 를 바 꿀 수 있 습 니 다.해결 방법 은 리 셋 함수 에서 자체 적 으로 작업 디 렉 터 리 를 수 동 으로 수정 하고 chdir 함수 로 수정 하 는 것 입 니 다.이 점 은 자주 만 나 지 않 는 것 같 습 니 다.만 났 을 때 매 뉴 얼 을 찾 아 보 세 요.

좋은 웹페이지 즐겨찾기