PHP 프로그램을 작성할 때 종종 이런 문제가 발생합니다.
header() 함수, session() 함수, 쿠키 함수를 사용하는 것 외에도 문제가 있을 수 있습니다
PHP 프로그램에서는 다음과 같습니다. 오류가 보고됩니다:
헤더 정보를 수정할 수 없습니다 - 헤더가 이미 전송되었습니다(출력 시작
헤더 정보를 수정할 수 없습니다. 이 오류를 해결하려면 두 가지 문제를 이해해야 합니다.
첫 번째, http 프로토콜
http 프로토콜에서는 서버가 html 파일을 브라우저에 출력합니다. html 파일은 두 부분으로 구성됩니다. 한 부분은 우리 페이지 자체의 데이터이고 다른 부분은 html 페이지의 헤더 정보에는 페이지가 표시되는 인코딩 형식, html 데이터의 크기, 점프 여부, 캐시 여부 등과 같은 많은 데이터가 포함되어 있습니다. 정보가 생성되면 수정이 허용되지 않습니다. 이것이 헤더 정보를 수정하는 이유입니다.
두 번째, PHP의 캐싱 메커니즘
캐시는 두 부분으로 구성됩니다. 하나는 프로그램 캐시로, 두 번째는 PHP에서 제공하는 캐시 모듈입니다. PHP 모듈 캐시가 켜져 있는 경우 프로그램에 에코 데이터가 있으면 데이터가 캐시에 저장되며 HTML 파일을 직접 생성하는 대신 PHP 프로그램 실행이 끝날 때까지 기다린 다음 헤더 파일을 포함하여 모듈에 의해 캐시된 데이터로 HTML 코드를 생성합니다. 다음은 두 가지 예입니다.
1. 캐시가 켜져 있지 않습니다(기본값은 다음과 같습니다)
<?php echo "123"; header("Content-type:text/html;charset=utf-8") echo "456"; ?>
이때 헤더 정보를 수정할 수 없다는 오류가 노출되었습니다.
2. 캐싱 메커니즘을 활성화합니다
<?php ob_start() ; //开启页面缓存 echo "123"; header("Content-type:text/html;charset=utf-8") echo "456"; ?>
예제에서는 캐시 상태가 켜지지 않고 echo "123"에 도달하면 HTML 코드가 생성됩니다. 헤더 함수는 헤더 파일 정보를 수정할 수 없으며 오류가 보고됩니다. 예제 2, ob_start(); 캐시를 활성화합니다. (ob은 output_buffer) echo "123"이면 데이터가 캐시 모듈에 기록되고 이때 HTML 페이지가 실행됩니다. 프로그램이 실행되면 캐시 모듈의 데이터가 완전한 HTML 페이지로 다시 생성되므로 오류가 보고되지 않습니다.
둘째, PHP의 캐싱 메커니즘 기능 및 활성화 방법
위에서 언급한 것처럼 ob_start() 함수는 캐시 모듈을 열 수 있지만 이 함수는 필요한 경우에만 이 페이지를 엽니다. php.ini 파일을 수정하고,output_buffering 옵션을 찾아 이를output_buffering = 4096으로 수정할 수 있습니다(On도 가능). 숫자는 캐시 크기를 나타냅니다.
PHP 캐싱 메커니즘에도 몇 가지 기능이 있습니다.
ob_start()가 출력 버퍼링을 시작하면 PHP는 출력을 중지합니다. , 출력은 내부 버퍼로 전송됩니다.
ob_get_contents() 이 함수는 내부 버퍼의 내용을 반환합니다. 이는 출력을 문자열로 변환하는 것과 같습니다. 내부 버퍼의 길이를 반환합니다.
ob_end_flush()는 출력 버퍼를 종료하고 해당 버퍼의 내용을 출력합니다.
ob_end_clean()은 출력을 종료합니다. buffer, 그리고 버퍼의 내용을 버립니다.