您好,欢迎访问一九零五行业门户网

CI框架源码阅读---------Output.php_PHP教程

[php]  
_zlib_oc   
        // 如果配置项中开启了输出压缩功能则 $this->_zlib_oc 的值为on  
        $this->_zlib_oc = @ini_get('zlib.output_compression');
// get mime types for later  
        // 获取mimetype  
        if (defined('environment') and file_exists(apppath.'config/'.environment.'/mimes.php'))  
        {  
            include apppath.'config/'.environment.'/mimes.php';  
        }  
        else  
        {  
            include apppath.'config/mimes.php';  
        }
// $mimes 是mimes.php中定义的一个数组  
        $this->mime_types = $mimes;
log_message('debug', output class initialized);  
    }
// --------------------------------------------------------------------
/** 
     * get output 
     * 使用这个方法,你可以得到将要输出的数据,并把它保存起来 
     * returns the current output string 
     * 返回当前输出的字符串 
     * @access  public 
     * @return  string 
     */  
    function get_output()  
    {  
        return $this->final_output;  
    }
// --------------------------------------------------------------------
/** 
     * set output 
     * 
     * sets the output string 
     * 设置输出的字符串 
     * @access  public 
     * @param   string 
     * @return  void 
     */  
    function set_output($output)  
    {  
        $this->final_output = $output;
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * append output 
     * 在最终输出字符串后,追加数据 
     * appends data onto the output string 
     *  
     * @access  public 
     * @param   string 
     * @return  void 
     */  
    function append_output($output)  
    {  
        if ($this->final_output == '')  
        {  
            $this->final_output = $output;  
        }  
        else  
        {  
            $this->final_output .= $output;  
        }
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * set header 
     * 使用此方法,允许你设置将会被发送到浏览器的http协议的标头,作用相当于php的标准函数: header()。 
     * lets you set a server header which will be outputted with the final display. 
     * 允许您设置一个服务器头用于最终的显示输出。 
     * note:  if a file is cached, headers will not be sent.  we need to figure 计算 out 
     * how to permit header data to be saved with the cache data... 
     * 
     * @access  public 
     * @param   string 
     * @param   bool 
     * @return  void 
     */  
    function set_header($header, $replace = true)  
    {  
        // if zlib.output_compression is enabled it will compress the output,  
        // but it will not modify the content-length header to compensate 补偿 for  
        // the reduction减少 还原, causing the browser to hang waiting for more data.  
        // we'll just skip content-length in those cases.
if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0)  
        {  
            return;  
        }
$this->headers[] = array($header, $replace);
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * set content type header 
     * 设置content-type 
     * @access  public 
     * @param   string  extension of the file we're outputting 
     * @return  void 
     */  
    function set_content_type($mime_type)  
    {  
        if (strpos($mime_type, '/') === false)  
        {  
            $extension = ltrim($mime_type, '.');
// is this extension supported?  
            if (isset($this->mime_types[$extension]))  
            {  
                $mime_type =& $this->mime_types[$extension];
if (is_array($mime_type))  
                {  
                    $mime_type = current($mime_type);  
                }  
            }  
        }
$header = 'content-type: '.$mime_type;
$this->headers[] = array($header, true);
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * set http status header 
     * moved to common procedural functions in 1.7.2 
     * 允许你手动设置服务器状态头(header) 
     * @access  public 
     * @param   int     the status code 
     * @param   string 
     * @return  void 
     */  
    function set_status_header($code = 200, $text = '')  
    {  
        set_status_header($code, $text);
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * enable/disable profiler 
     * 允许你开启或禁用分析器 
     * @access  public 
     * @param   bool 
     * @return  void 
     */  
    function enable_profiler($val = true)  
    {  
        $this->enable_profiler = (is_bool($val)) ? $val : true;
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * set profiler sections 
     * 设置$this->_profiler_sections 
     * allows override of default / config settings for profiler section display 
     * 允许你在评测器启用时,控制(开/关)其特定部分 
     *  
     * @access  public 
     * @param   array 
     * @return  void 
     */  
    function set_profiler_sections($sections)  
    {  
        foreach ($sections as $section => $enable)  
        {  
            $this->_profiler_sections[$section] = ($enable !== false) ? true : false;  
        }
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * set cache 
     * 设置缓存以及缓存时间  
     * @access  public 
     * @param   integer 其中 $time 是你希望缓存更新的 分钟 数 
     * @return  void 
     */  
    function cache($time)  
    {  
        $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
return $this;  
    }
// --------------------------------------------------------------------
/** 
     * display output 
     * 显示输出 
     * all view data is automatically put into this variable by the controller class: 
     * 
     * $this->final_output 
     * 
     * this function sends the finalized output data to the browser along 
     * with any server headers and profile data.  it also stops the 
     * benchmark timer so the page rendering speed and memory usage can be shown. 
     * 
     * @access  public 
     * @param   string 
     * @return  mixed 
     */  
    function _display($output = '')  
    {  
        // note:  we use globals because we can't use $ci =& get_instance()  
        // since this function is sometimes called by the caching mechanism,  
        // which happens before the ci super object is available.  
        // 注意:我们使用global 是因为我们不能使用$ci =& get_instance()   
        global $bm, $cfg;
// grab the super object if we can.  
        // //当然如果可以拿到超级控制器,我们先拿过来。  
        if (class_exists('ci_controller'))  
        {  
            $ci =& get_instance();  
        }
// --------------------------------------------------------------------
// set the output data  
        // 设置输出数据  
        if ($output == '')  
        {  
            $output =& $this->final_output;  
        }
// --------------------------------------------------------------------
// do we need to write a cache file?  only if the controller does not have its  
        // own _output() method and we are not dealing with a cache file, which we  
        // can determine by the existence of the $ci object above  
        // 如果缓存时间>0 ,$ci 超级对象存在并且超级对象下面存在_output 方法  
        // 调用_write_cache 方法,写一个缓存文件  
        if ($this->cache_expiration > 0 && isset($ci) && ! method_exists($ci, '_output'))  
        {  
            $this->_write_cache($output);  
        }
// --------------------------------------------------------------------
// parse out the elapsed time and memory usage,  
        // then swap the pseudo-variables with the data  
        // 计算代码执行时间和内存使用时间  
        $elapsed = $bm->elapsed_time('total_execution_time_start', 'total_execution_time_end');
// 如果$this->parse_exec_vars为true,将输出中的{elapsed_time},{memory_usage}  
        // 替换为计算出的时间。  
        if ($this->parse_exec_vars === true)  
        {  
            $memory  = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'mb';
$output = str_replace('{elapsed_time}', $elapsed, $output);  
            $output = str_replace('{memory_usage}', $memory, $output);  
        }
// --------------------------------------------------------------------
// is compression requested?压缩传输的处理。  
        if ($cfg->item('compress_output') === true && $this->_zlib_oc == false)  
        {  
            if (extension_loaded('zlib'))  
            {  
                if (isset($_server['http_accept_encoding']) and strpos($_server['http_accept_encoding'], 'gzip') !== false)  
                {  
                    ob_start('ob_gzhandler');  
                }  
            }  
        }
// --------------------------------------------------------------------
// are there any server headers to send?  
        // 有没有服务器头发送?  
        if (count($this->headers) > 0)  
        {  
            foreach ($this->headers as $header)  
            {  
                @header($header[0], $header[1]);  
            }  
        }
// --------------------------------------------------------------------
// does the $ci object exist?  
        // if not we know we are dealing with a cache file so we'll  
        // simply echo out the data and exit.  
        // 如果没有$ci就证明当前是一个缓存的输出,我们只简单的发送数据并退出  
        if ( ! isset($ci))  
        {  
            echo $output;  
            log_message('debug', final output sent to browser);  
            log_message('debug', total execution time: .$elapsed);  
            return true;  
        }
// --------------------------------------------------------------------
// do we need to generate profile data?  
        // if so, load the profile class and run it.  
        // 如果开启了性能分析我们就调用,  
        // 会生成一些报告到页面尾部用于辅助我们调试。  
        if ($this->enable_profiler == true)  
        {  
            $ci->load->library('profiler');
if ( ! emptyempty($this->_profiler_sections))  
            {  
                $ci->profiler->set_sections($this->_profiler_sections);  
            }
// if the output data contains closing
and
tags  
            // we will remove them and add them back after we insert the profile data  
            // 如果存在
标签,我们将删除,插入我们的性能分析代码后再添加回去  
            if (preg_match(|.*?
|is, $output))  
            {  
                $output  = preg_replace(|.*?
|is, '', $output);  
                $output .= $ci->profiler->run();  
                $output .= '
';  
            }  
            else  
            {  
                $output .= $ci->profiler->run();  
            }  
        }
// --------------------------------------------------------------------
// does the controller contain a function named _output()?  
        // if so send the output there.  otherwise, echo it.  
        // 如果控制器中有_output 这个方法我们直接调用  
        // 如果没有直接发送数据到浏览器  
        if (method_exists($ci, '_output'))  
        {  
            $ci->_output($output);  
        }  
        else  
        {  
            echo $output;  // send it to the browser!  
        }
log_message('debug', final output sent to browser);  
        log_message('debug', total execution time: .$elapsed);  
    }
// --------------------------------------------------------------------
/** 
     * write a cache file 
     * 生成一个缓存文件 
     * @access  public 
     * @param   string 
     * @return  void 
     */  
    function _write_cache($output)  
    {  
        // 调用超级对象  
        $ci =& get_instance();  
        // 找到缓存路径  
        $path = $ci->config->item('cache_path');
$cache_path = ($path == '') ? apppath.'cache/' : $path;
// 如果缓存路径不是一个文件夹或者不可写 ,报错返回。  
        if ( ! is_dir($cache_path) or ! is_really_writable($cache_path))  
        {  
            log_message('error', unable to write cache file: .$cache_path);  
            return;  
        }
// 获取$uri  
        $uri =  $ci->config->item('base_url').  
                $ci->config->item('index_page').  
                $ci->uri->uri_string();
// 生成缓存文件。  
        $cache_path .= md5($uri);
if ( ! $fp = @fopen($cache_path, fopen_write_create_destructive))  
        {  
            log_message('error', unable to write cache file: .$cache_path);  
            return;  
        }
// 计算缓存文件过期时间。  
        $expire = time() + ($this->cache_expiration * 60);
if (flock($fp, lock_ex))  
        {  
            fwrite($fp, $expire.'ts--->'.$output);  
            flock($fp, lock_un);  
        }  
        else  
        {  
            log_message('error', unable to secure a file lock for file at: .$cache_path);  
            return;  
        }  
        fclose($fp);  
        @chmod($cache_path, file_write_mode);
log_message('debug', cache file written: .$cache_path);  
    }
// --------------------------------------------------------------------
/** 
     * update/serve a cached file 
     * 在codeigniter.php里面有调用此方法,此方法是负责缓存的输出, 
     * 如果在codeigniter.php中调用此方法有输出,则 
     * 本次请求的运行将直接结束,直接以缓存输出作为响应。 
     *  
     * @access  public 
     * @param   object  config class 
     * @param   object  uri class 
     * @return  void 
     */  
    function _display_cache(&$cfg, &$uri)  
    {  
        // 取得保存缓存的路径  
        $cache_path = ($cfg->item('cache_path') == '') ? apppath.'cache/' : $cfg->item('cache_path');
// build the file path.  the file name is an md5 hash of the full uri  
        // 一条准确的路由都会对应一个缓存文件,缓存文件是对应路由字符串的md5密文。  
        $uri =  $cfg->item('base_url').  
                $cfg->item('index_page').  
                $uri->uri_string;
$filepath = $cache_path.md5($uri);
// 如果没有此缓存文件,获取缓存内容失败,则可以返回false。  
        if ( ! @file_exists($filepath))  
        {  
            return false;  
        }  
        // 如果有此缓存文件,但是无法读,获取缓存内容失败,同样返回false。  
        if ( ! $fp = @fopen($filepath, fopen_read))  
        {  
            return false;  
        }
// 打开到缓存文件,并以$fp作为句柄。下一步先取得共享锁(读取)。  
        flock($fp, lock_sh);
$cache = '';  
        if (filesize($filepath) > 0)  
        {  
            $cache = fread($fp, filesize($filepath));  
        }  
        // 解锁  
        flock($fp, lock_un);  
        // 关闭文件连接。  
        fclose($fp);
// 下面这个ts--->字样,只是因为ci的缓存文件里面的内容  
        // 是规定以数字+ts--->开头而已。这个数字是代表创建时间。  
        // 如果不符合此结构,可视为非ci的缓存文件,或者文件已损坏,  
        // 获取缓存内容失败,返回false。  
        // strip out the embedded timestamp  
        if ( ! preg_match(/(\d+ts--->)/, $cache, $match))  
        {  
            return false;  
        }
// has the file expired? if so we'll delete it.  
        // 判断缓存是否过期,如果过期我们将删除它  
        if (time() >= trim(str_replace('ts--->', '', $match['1'])))  
        {  
            if (is_really_writable($cache_path))  
            {  
                @unlink($filepath);  
                log_message('debug', cache file has expired. file deleted);  
                return false;  
            }  
        }
// display the cache  
        $this->_display(str_replace($match['0'], '', $cache));  
        log_message('debug', cache file is current. sending it to browser.);  
        return true;  
    }
}  
// end output class
/* end of file output.php */  
/* location: ./system/core/output.php */
http://www.bkjia.com/phpjc/477678.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/477678.htmltecharticle[php] ?php if ( ! defined(basepath)) exit(no direct script access allowed); /** * codeigniter * * an open source application development framework for php 5.1.6 or newer * * @packag...
其它类似信息

推荐信息