【问题标题】:PHP delay the output of headers until the entire PHP script has been run?PHP延迟标题的输出,直到整个PHP脚本运行?
【发布时间】:2011-03-10 16:26:21
【问题描述】:

是否可以延迟向浏览器输出标头,直到整个 php 脚本执行完毕?

【问题讨论】:

  • what is output buffering?的可能重复
  • @Jon: 这不是重复的。 答案是输出缓冲,但这是两个完全不同的问题。
  • 同意。仅仅因为答案相同并不意味着问题相同。
  • 输出缓冲作为 A 答案,并不意味着它是 正确的 一个
  • @RobertPitt:是的,因为在工作流程中间尝试输出标题时,始终可以选择完整的项目大修。

标签: php http-headers


【解决方案1】:

一旦第一段代码从 php 发送到网络服务器,标头就会被发送。

所以你可以“不回显任何东西”直到脚本结束或use output buffering 来实现同样的目标

【讨论】:

    【解决方案2】:

    这是大多数专业程序员建议的方式,您应该始终这样做的原因是您可以有效地管理错误和错误页面。

    如果您的应用程序已经构建为在执行脚本时显示输出,那么我建议您从头开始。

    我通常管理输出的方式是用一个小的模板系统,模板系统不需要解析模板等,只需要传入一组数据,然后包含所需的模板。

    您应该创建一个以$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

    【讨论】:

    • -1:为什么?这正是 Zend Engine 处理标头的方式。您可以随时使用header()headers_list()header_remove() 来处理标头。你的方法只会增加一层复杂性,如果你忘记了一步,它会在后面咬你……对不起,但是“专业程序员”不会为了增加复杂性而增加复杂性。
    • 这不是复杂性,而是结构和组织,不是为了它,而是为了帮助管理逻辑和视图的分离。使用 ob_start 将不会捕获已发送的标头,使用 ob_start 将捕获输出,如果在输出中已发送多个标头,则这违反了应用程序体系结构的标准。查看 != 逻辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2011-05-11
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多