2011-03-10 2 views
1

전체 PHP 스크립트 실행이 끝날 때까지 헤더 출력을 브라우저로 지연시킬 수 있습니까?PHP는 전체 PHP 스크립트가 실행될 때까지 헤더 출력을 지연합니까?

+0

가능 중복 [출력 버퍼링 무엇인가요? (http://stackoverflow.com/questions/2832010/what-is-output-buffering) – Jon

+0

http://php.net/manual/ en/function.ob-start.php – kjy112

+4

@ 존 : ** 이것은 복제품이 아닙니다. ** 출력 버퍼링이 예입니다. 그러나 이것은 완전히 다른 두 가지 질문입니다. –

답변

3

첫 번째 코드가 php에서 웹 서버로 보내지면 헤더가 전송됩니다. 하여 스크립트의 끝 또는 use output buffering 같은 일

1

이것은 대부분의 전문 프로그래머가 권합니다 방법입니다을 달성 할 때까지

그래서 그냥 "아무것도 표시하지"수, 이유 당신은이 방법으로하면된다 항상한다 오류 및 오류 페이지를 효과적으로 관리 할 수 ​​있습니다.

응용 프로그램이 이미 스크립트가 실행될 때 출력을 표시하도록 작성된 경우 처음부터 시작하는 것이 좋습니다.

일반적으로 출력을 관리하는 방법은 작은 템플릿의 시스템으로, 템플릿의 시스템은 템플릿 등을 구문 분석 할 필요가 없습니다. 단지 데이터 집합을 전달한 다음 필요한 템플릿을 포함해야합니다.

$template->set(key[,value = true])의 형식으로 데이터를 인식하는 클래스를 만든 다음이 함수가 실행될 때 $template->display(filename)과 같이 표시되는 함수를 만들어야합니다. 변수를 추출한 다음 템플릿 파일을 포함해야합니다. exit(0)을 호출하면 코드가 더 이상 실행되지 않습니다.

간단한 템플릿 시스템과 같이 할 수있다 :

class Template 
{ 
    private $_data = array(); 

    public function set($key,$value = true) 
    { 
     $this->_data[$key] = $value; 
    } 

    public function display($template) 
    { 
     //Check template exuists 
     extract($this->_data); 
     require_once $template; 
     exit(0); 
    } 
} 

다음과 같이 아주 간단하게 사용

$template = new Template(); 
$template->set("title","Practical home Page"); 
$template->set("header","My Home Page"); 

$lists = array(
    array(
     "value" => "list item 1", 
     "id" => "list_item_1", 
     "class" => "item" 
    ), 
    array(
     "value" => "list item 2", 
     "id" => "list_item_2", 
     "class" => "item" 
    ) 
); 

$template->set("menu",$lists); 
$template->display("templates/homepage.php"); 

당신은 또한 내가 이전에 대답 한 다음 대답을 읽고 싶습니다 수 있습니다!

PHP Looping Template Engine - From Scratch

+0

-1 : 이유가 무엇입니까? 이것이 Zend Engine이 헤더를 처리하는 방법입니다. ['header()'] (http://php.net/header), ['headers_list()'] (http://php.net/headers_list), ['header_remove()'] (http://php.net/header_remove) 언제든지 헤더를 사용하여 작업 할 수 있습니다. 당신의 방법은 단지 단계를 잊어 버렸을 때 뒤쪽에서 당신을 물들게 할 복잡성 계층을 추가합니다 ... 미안하지만 * "전문 프로그래머"*는 그것을 위해 복잡성을 추가하지 않습니다. –

+2

이것은 복잡성이 아니라 구조와 조직이며, 논리와 관점의 분리 관리를 돕는 것이 아닙니다. ob_start를 사용하면 전송 된 헤더를 캡처하지 못합니다. ob_start를 사용하면 출력을 캡처 할 수 있습니다. 여러 헤더가 전송 된 경우 애플리케이션 아키텍처 표준에 위배됩니다. 보기! = 논리 – RobertPitt

관련 문제