PHP输出缓存ob系列函数详解_php技巧_脚本之家

澳门新葡亰娱乐在线 1

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器。下面我说说ob的基本作用:
1)防止在浏览器有输出之后再使用setcookie或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。
2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。

今天我们要介绍一些关于改善和优化PHP代码的提示和技巧。请注意,这些PHP技巧适用于初学者,而不是那些已经在使用MVC框架的人。

对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真用上的,其实稍稍修改下代码,就可以实现页面的gzip压缩。复制代码
代码如下:ob_start;要缓存的内容没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断浏览器是否支持gzip(现在好像都支持,iphone浏览器好像都支持了)。以前的做法是判断一下浏览器是否支持gzip,然后用第三方的gzip函数来压缩ob_get_contents()
的内容,最后echo。

澳门新葡亰娱乐在线 1

一、ob系列函数中常用函数集锦复制代码
代码如下:ob_start();
//打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。

1.不要使用相对路径,要定义一个根路径

这样的代码行很常见:

require_once('../../lib/some_class.php');

这种方法有很多缺点:

  • 它首先搜索php包括路径中的指定目录,然后查看当前目录。因此,会检查许多目录。
  • 当一个脚本被包含在另一个脚本的不同目录中时,它的基本目录变为包含脚本的目录。
  • 澳门新葡亰娱乐在线,另一个问题是,当一个脚本从cron运行时,它可能不会将它的父目录作为工作目录。

所以使用绝对路径便成为了一个好方法:

define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');

//rest of the code

这就是一个绝对路径,并且会一直保持不变。但是,我们可以进一步改善。目录/var/www/project可以变,那么我们每次都要改吗?

不,使用魔术常量如__FILE__可以让它变得可移植。请仔细看:

//suppose your script is /var/www/project/index.php
//Then __FILE__ will always have that full path.

define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');

//rest of the code

所以现在,即使你将项目转移到一个不同的目录,例如将其移动到一个在线的服务器上,这些代码不需要更改就可以运行。

ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区;
//删除内部缓冲区的内容,关闭缓冲区;
//返回内部缓冲区的内容,关闭缓冲区。相当于执行
ob_get_contentsob_flush();
//发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush();
//发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush();
//返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush;
//将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。

2.不使用require,包括require_once或include_once

你的脚本上可能会包括各种文件,如类库,实用程序文件和辅助函数等,就像这些:

require_once('lib/Database.php');
require_once('lib/Mail.php');

require_once('helpers/utitlity_functions.php');

这相当粗糙。代码需要更加灵活。写好辅助函数可以更容易地包含东西。举个例子:

function load_class($class_name)
{
    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');
    require_once( $path ); 
}

load_class('Database');
load_class('Mail');

看到区别了吗?很明显。不需要任何更多的解释。

你还可以进一步改善:

function load_class($class_name)
{
    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');

    if(file_exists($path))
    {
        require_once( $path ); 
    }
}

这样做可以完成很多事情:

  • 为同一个类文件搜索多个目录。
  • 轻松更改包含类文件的目录,而不破坏任何地方的代码。
  • 使用类似的函数用于加载包含辅助函数、HTML内容等的文件。

ob_get_contents(); //返回缓冲区的内容,不输出。ob_get_length();
//返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level();
//Return the nesting level of the output buffering
mechanism.ob_get_status(); //Get status of output buffers.

3.在应用程序中维护调试环境

在开发过程中,我们echo数据库查询,转储创造问题的变量,然后一旦问题被解决,我们注释它们或删除它们。但让一切留在原地可提供长效帮助。

在开发计算机上,你可以这样做:

define('ENVIRONMENT' , 'development');

if(! $db->query( $query )
{
    if(ENVIRONMENT == 'development')
    {
        echo "$query failed";
    }
    else
    {
        echo "Database error. Please contact administrator";
    }    
}

并且在服务器上,你可以这样做:

define('ENVIRONMENT' , 'production');

if(! $db->query( $query )
{
    if(ENVIRONMENT == 'development')
    {
        echo "$query failed";
    }
    else
    {
        echo "Database error. Please contact administrator";
    }    
}

ob_implicit_flush();
//打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush,所谓绝对刷新,即当有输出语句被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。

4.通过会话传播状态消息

状态消息是那些执行任务后生成的消息。

<?php
if($wrong_username || $wrong_password)
{
    $msg = 'Invalid username or password';
}
?>
<html>
<body>

<?php echo $msg; ?>

<form>
...
</form>
</body>
</html>

这样的代码很常见。使用变量来显示状态信息有一定的局限性。因为它们无法通过重定向发送(除非你将它们作为GET变量传播给下一个脚本,但这非常愚蠢)。而且在大型脚本中可能会有多个消息等。

最好的办法是使用会话来传播(即使是在同一页面上)。想要这样做的话在每个页面上必须得有一个session_start。

function set_flash($msg)
{
    $_SESSION['message'] = $msg;
}

function get_flash()
{
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
    return $msg;
}

在你的脚本中:

<?php
if($wrong_username || $wrong_password)
{
    set_flash('Invalid username or password');
}
?>
<html>
<body>

Status is : <?php echo get_flash(); ?>
<form>
...
</form>
</body>
</html>

ob_gzhandler
//ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers //List
all output handlers in useoutput_add_rewrite_var //Add URL rewriter
valuesoutput_reset_rewrite_vars //Reset URL rewriter values

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图