使用ob_start()时无法捕获回显或错误

时间:2015-11-19 18:24:47

标签: php error-handling

我正在尝试编写一个简单的模板解析对象,我的代码效果很好。问题是主页面中的任何echo命令或者ob_start都会缓冲错误。触发destruct上的错误处理路由并在第52行死亡。但是这不会运行。任何想法?

<?php

define('ERROR_FOLDER', 'includes/error/');
define('HTML_FOLDER', 'includes/pages/');
class HTML{
    /* 
        Takes a template file and replaces all instances of <!--VARNAME--> with the value inputed.

        All values should be strings.   
    */

    private $template;
    private $vars;          //array of user defined variables

    function __construct($filePath=''){
        //stop writing anything to the page-html-output
        ob_start();

        //read contents of template
        $this->template=file_get_contents(HTML_FOLDER.$filePath);
    }

    function __destruct() {
        echo $this->execute();
    }

    function getCode() {
        return $this->execute();
    }

    public function get($var) {
        return $this->vars[$var];
    }

    public function set($var,$value) {
        $this->vars[$var]=$value;
    }

    public function append($var,$value) {
        $this->vars[$var].=$value;
    }


    /* ********************************************************************************************************
    *                                            Private Functions                                            *
    ******************************************************************************************************** */

    private function execute() {
        //handel any errors
        $errors=ob_get_contents();
        if (strlen($errors>0)) {
            echo $errors;die();
            //create error file
            //name: date_time_random_pageName
            $fileName=DateTime::format("Y-m-d_H-i-s-u").'_'.rand(10000,99999).'_'.strtok($_SERVER["REQUEST_URI"],'?').'.txt';
            $errorMessage='Error For: ' . $_SERVER[REQUEST_URI] . "\r\n" . $errors;
            file_put_contents(ERROR_FOLDER.$fileName, $errorMessage);
        }       

        //erase any error messages
        ob_end_clean();


        //get template
        $html=$this->template;

        //create search arrays
        $from=array();
        $to=array();
        foreach ($this->vars as $key=>$value) {
            $from[]='<!!--'.$key.'--!!>';
            $to[]=$value;
        }       

        //replace any vars added
        $html=str_replace($from,$to,$html);

        //minimize html text                            adapted from http://stackoverflow.com/questions/6225351/how-to-minify-php-page-html-output
        $from = array(
            '/\>[^\S ]+/s',                             // strip whitespaces after tags, except space
            '/[^\S ]+\</s',                             // strip whitespaces before tags, except space
            '/(\s)+/s',                                 // shorten multiple whitespace sequences
            '/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s',        // removes comments
            '/<!!--.*?--!!>|\t|(?:\r?\n[ \t]*)+/s'      // removes unused vars
        );
        $to = array(
            '>',
            '<',
            '\\1',
            '',
            ''
        );
        $html = preg_replace($from, $to, $html);


        return $html;       
    }
}   
?>

这是一个测试脚本

<?php
    require_once "includes/HTML.php";

    $page=new HTML('template-main.html');
    $page->set('list','Hello World');
    echo "should get saved to file and never show up on screen.";   
?>

template-main.html应该有

<!!--list--!!>

我期望看到的是: 应该保存到文件,永远不会出现在屏幕上。因为这应该存储在对象的第51行之后的$ errors中。

我得到的是:Hello World

2 个答案:

答案 0 :(得分:0)

尝试用ob_end_flush()包围你的回声;和ob_start();

示例:

ob_end_flush();

# CODE THAT NEEDS IMMEDIATE FLUSHING

ob_start();

来源:How to flush output after each `echo` call?

答案 1 :(得分:0)

if(strlen($ errors&gt; 0)){

应该是

if(strlen($ errors)&gt; 0){