php函数ob_start()、ob_end_clean()、ob_get_contents()

 更新时间:2016年11月25日 15:05  点击:2092
文章介绍了php函数ob_start()、ob_end_clean()、ob_get_contents(),有需要的朋友可参考一下。

下面3个函数的用法

ob_get_contents() - 返回输出缓冲区的内容


ob_get_contents

(PHP 4, PHP 5)

ob_get_contents — 返回输出缓冲区的内容
说明
string ob_get_contents ( void )

只是得到输出缓冲区的内容,但不清除它。
返回值

此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回FALSE 。
范例

 代码如下 复制代码

Example #1 A simple ob_get_contents() example
<?php

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World";

$out2 = ob_get_contents();

ob_end_clean();

var_dump($out1, $out2);
?>

以上例程会输出:

string(6) "Hello "
string(11) "Hello World"

 

ob_flush() - 冲刷出(送出)输出缓冲区中的内容

ob_flush

(PHP 4 >= 4.2.0, PHP 5)

ob_flush — 冲刷出(送出)输出缓冲区中的内容
说明
void ob_flush ( void )

这个函数将送出缓冲区的内容(如果里边有内容的话)。如果想进一步处理缓冲区中的内容,必须在ob_flush()之前调用ob_get_contents() ,因为在调用ob_flush()之后缓冲区内容将被丢弃。

此函数不会销毁输出缓冲区,而像ob_end_flush() 函数会销毁缓冲区。
返回值

没有返回值。


ob_clean() - 清空(擦掉)输出缓冲区


ob_clean

(PHP 4 >= 4.2.0, PHP 5)

ob_clean — 清空(擦掉)输出缓冲区
说明
void ob_clean ( void )

此函数用来丢弃输出缓冲区中的内容。

此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲区。
返回值

没有返回值。

ob_end_flush() - 冲刷出(送出)输出缓冲区内容并关闭缓冲


ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
说明
bool ob_end_flush ( void )

这个函数将送出最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。如果想进一步处理缓冲区中的内容,必须在ob_end_flush()之前调用 ob_get_contents(),因为在调用ob_end_flush()后缓冲区内容被丢弃。

    Note: 这个函数与ob_get_flush()相似,不同的是ob_get_flush()会把缓冲区中的内容作为字符串返回。

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE. 错误的原因首先是,在调用时没有一个起作用的缓冲区,或者是因为某些原因缓冲区不能被删除(可能对特殊缓冲区而言)。
错误/异常

如果函数失败了,将引发一个E_NOTICE异常。
更新日志

版本  说明
4.2.0  添加了布尔返回值。

范例

Example #1 ob_end_flush() example

下面的例子给出了一种送出缓冲区内容并关闭所有输出缓冲区的容易的方法:

 代码如下 复制代码
<?php
  while (@ob_end_flush());
?>

ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲

ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
说明
bool ob_end_clean ( void )

此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。
返回值

成功时返回 TRUE, 或者在失败时返回 FALSE. 错误的原因首先是,在调用时没有一个起作用的缓冲区,或者是因为某些原因缓冲区不能被删除(可能对特殊缓冲区而言)。
错误/异常

如果函数失败了,将引发一个E_NOTICE异常。
更新日志

版本  说明
4.2.0  添加了布尔返回值。

范例

下面的例子给出了一种去除所有输出缓冲区的方法:

 代码如下 复制代码

Example #1 ob_end_clean() example
<?php
ob_start();
echo 'Text that won't get displayed.';
ob_end_clean();
?>

flush() - 刷新输出缓冲    

通常是ob_flush();flush()同时一起使用
使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。
然后用ob_get_contents得到缓冲区的数据。

ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。

函数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。
此时得用一个函数ob_get_contents()在ob_end_clean()前面来获得缓冲区的内容。
这样的话, 能将在执行ob_end_clean()前把内容保存到一个变量中,然后在ob_end_clean()后面对这个变量做操作。

大家可通常用的microtime()获取页面开始和结束时的时间并相减的话,计算结果是页面运行 所经历的一段时间,但这并不一定是该页面自身运行的时间
 代码如下 复制代码

<?php
//实例:计算页面运行时加载时间
//分析:页面打开时获取一个时间,加载完成时获取一个时间,运行时间即二者之差

//1.自定义函数
function fn(){
 list($a,$b) = explode(' ',microtime()); //获取并分割当前时间戳和微妙数,赋值给变量
 return $a+$b;
}

//2.获取开始时间
$start_time = fn();
//5.加载过程
for($i=0;$i<10000000;$i++){
 // do nothing;
}

//3.获取结束时间
$end_time = fn();

//4.计算差值
echo $end_time-$start_time;

//5.格式化输出
echo '<br />';
$t = $end_time-$start_time;
echo round($t,2);

?>

使用microtime()获取页面开始和结束时的时间并相减的话,计算结果是页面运行
所经历的一段时间,但这并不一定是该页面自身运行的时间。因为可能存在多个PHP脚
本页面共同执行的情况,所以我觉得那个方法是不准确的


下面从网上找到一个关于php中计算页面程序运行时间的实例有需要的朋友可参考一下。

最近写了一个程序运行的时间计算类,供大家参考:

 代码如下 复制代码
class Timer { 
    private $StartTime = 0;//程序运行开始时间
    private $StopTime  = 0;//程序运行结束时间
    private $TimeSpent = 0;//程序运行花费时间
    function start(){//程序运行开始
        $this->StartTime = microtime(); 
    } 
    function stop(){//程序运行结束
        $this->StopTime = microtime(); 
    } 
    function spent(){//程序运行花费的时间
        if ($this->TimeSpent) { 
            return $this->TimeSpent; 
        } else {
         list($StartMicro, $StartSecond) = explode(" ", $this->StartTime);
         list($StopMicro, $StopSecond) = explode(" ", $this->StopTime);
            $start = doubleval($StartMicro) + $StartSecond;
            $stop = doubleval($StopMicro) + $StopSecond;
            $this->TimeSpent = $stop - $start;
            return substr($this->TimeSpent,0,8)."秒";//返回获取到的程序运行时间差
        } 
    } 

$timer = new Timer(); 
$timer->start();
//...程序运行的代码
$timer->stop();
echo "程序运行时间为:".$timer->spent();

再看简化程序 计算页面加载时间

 代码如下 复制代码


<?php
class runtime
{
        var $StartTime = 0;
        var $StopTime = 0;
        function get_microtime()
        {
                list($usec, $sec) = explode(' ', microtime());
                return ((float)$usec (float)$sec);
        }
       
        function start()
        {
                $this->StartTime = $this->get_microtime();
        }
       
        function stop()
        {
                $this->StopTime = $this->get_microtime();
        }
       
        function spent()
        {
                return round(($this->StopTime - $this->StartTime) * 1000, 1);
        }
}

//实例开始
$runtime= new runtime;
$runtime->start();
//你的代码开始
$a = 0;
for($i=0; $i<1000000; $i )
{
        $a = $i;
}
//你的代码结束
$runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
?>

最近在使用php的mongo 扩展进行数据统计计算,其中有一个时间戳字段,由于精确到了毫秒,长度有13位,但由于开始的时候是以字符串的形式存储:
 代码如下 复制代码

 


{ "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507-F4B0-E7AF-5432D5D8229D", "p" : "View_Prop_YepPage_Zheng", "cid" : "11", "url" : "http://shanghai.haozu.com/rental/broker/n/10481780", "rfpn" : "Listing_V2_IndexPage_All", "site" : "haozu", "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "stamp" : "1347349162159", "cip" : "116.226.70.44", "referer" : "http://shanghai.haozu.com/shop/1464934/", "cstamp" : "1347349323125", "sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47", "uguid" : "C00FF55B-3D3D-4B31-4318-12345B0DBE64", "pn" : "View_Prop_YepPage_Zheng", "cstparam" : { "proId" : NumberLong(10481780), "brokerId" : "326792", "tradeType" : "2", "userType" : "0", "channel" : "site", "entry" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "rule" : 0, "status" : "ok", "txid" : 0 }

后来改成数字格式:

 

 代码如下 复制代码

{ "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507-F4B0-E7AF-5432D5D8229D", "p" : "View_Prop_YepPage_Zheng", "cid" : "11", "url" : "http://shanghai.haozu.com/rental/broker/n/10481780", "rfpn" : "Listing_V2_IndexPage_All", "site" : "haozu", "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "stamp" : NumberLong("1347349162159"), "cip" : "116.226.70.44", "referer" : "http://shanghai.haozu.com/shop/1464934/", "cstamp" : "1347349323125", "sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47", "uguid" : "C00FF55B-3D3D-4B31-4318-12345B0DBE64", "pn" : "View_Prop_YepPage_Zheng", "cstparam" : { "proId" : NumberLong(10481780), "brokerId" : "326792", "tradeType" : "2", "userType" : "0", "channel" : "site", "entry" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "rule" : 0, "status" : "ok", "txid" : 0 }为字符串时,使用下面的查询是正常的

        $query = array ('log.stamp' => array ('$gte' => ‘1347346800000’, '$lt' => ‘1347350400000’));

但是改为数字后,使用下面的查询,死活没有结果,但是直接在mongo客户端直接查询是有结果的:

 

 代码如下 复制代码
 db.haozu_success.find({'log.stamp':{$gte:1347346800000,$lt:1347350400000}})

php手册上也是这么个用法:

 代码如下 复制代码
        $query = array ('log.stamp' => array ('$gte' => 1347346800000, '$lt' => 1347350400000));

花了好大一会找原因,开始时怀疑是php扩展的bug导致,经过一番思考。突然想到可能是类型问题导致,发现手册上有Types 介绍,所以正确的用法如下:

 代码如下 复制代码

        $query = array ('log.stamp' => array ('$gte' => new MongoInt64($time_range['start']), '$lt' => new MongoInt64($time_range['end'])));

另外,在使用mapreduce进行数据统计时,为了防止cursor出现超时异常,还需要设置一下超时时间

 

 代码如下 复制代码
$map = new MongoCode ( '
                function(){
                    var prop_id=this.log.cstparam.proId;
                    var key=this.log.site+prop_id
                    emit(key,{"channel":this.log.site,"prop_id":prop_id,"count":1});
                }
                ' );
        $reduce = new MongoCode ( '
                function(key,emits){
                    var total=0;
                    for(var i in emits){
                        total+=emits[i].count;
                    }
                    return {"channel":emits[0].channel,"prop_id":eval(emits[0].prop_id),"count":total};
                }
                ' );
$this->mongo_db->command ( array ('mapreduce' => $collection_name, 'map' => $map, 'reduce' => $reduce, 'out' => $tmp_result, 'query' => $query),array('timeout'=>self::MONGO_CURSOR_TIMEOUT) );
php中对象包括很多内容,如最常用的php类,接口,多态性 魔术方法(:_construct(),_destruct(),_clone)等。

类的声明:

 

 代码如下 复制代码

<?php
    权限修饰符 class 类名{   //权限修士符号:public,protected,private 或者省略3者.
      //类体;        //class 是建类关键字
    }             //类名必须跟在class 后面,且跟上{}.{}之间放类的成员.
  ?>
//ps:在class关键字前可以加权限修饰符外,还可以加static,abstract等关键字.一个类,即一对大括号之间的全部内容都要在一段代码段中,不允许将类中的内容分割成对块.
<?php
  class ConnDB{
    //....
?>
<?

    //...
  };
?>

 

成员属性:

  在类中直接声明的变量称为成员属性/变量.其类型可以为php中的标量类型和复合类型,使用资源类型和空类型是无效的.

此外,成员属性的声明时,必须要有关键字来修饰:有特定意义的关键字:public,protected,private ;不需要特定意义:var.声明成员属性时,没有必要赋初始值.

 

成员常量:

  以const常量修饰,例如:const PI = 3.1415926;

  常量的输出不需要实例化,直接由类名+常量名调用即可,格式为: 类名::常量名

ps. 特殊的访问方法:--------"$this" 和 "::"

1) $"this" 存在于每个成员方法当中,它是一个特殊的对象以用方法.成员方法属于那个对象,$this应用就代表那个对象,其作用就是专门完成对象内部成员之间的访问.

2) "::"成为作用域操作符,使用这个操作符可以在不创建对象的情况下调用类中的常量,变量和方法. 其语法格式如下:

  关键字::变量名/常量名/方法名

  关键字:parent,可以调用父类成员中的成员变量,成员方法和常量;

      self,可以调用当前类中的静态成员和常量;

      类名,可以调用类中的常量,变量和方法;   

  

成员方法:

  在类中声明的函数成为成员方法,在一个类中可以声明多个函数,即对象可以拥有多个成员方法.成员方法的声明和函数的声明相同,唯一特殊之处就是成员方法可以有关键字对它进行修饰,从而控制其访问权限.

类的实例化

  创建对象:

    $变量名 = new 类名称([参数]); //类的实例化.

  访问类成员:

    $变量名 -> 成员属性 = 值;

在php开发中经常会出现undefined index这种错误提示,下面我们看看方法总结吧。

平时用$_post[''],$_get['']获取表单中参数时会出现Notice: Undefined index: --------;

服务器配置修改
修改php.ini配置文件,

 代码如下 复制代码
error_reporting = E_ALL & ~E_NOTICE

程序判断

 代码如下 复制代码

function _get($str){
$val = !empty($_GET[$str]) ? $_GET[$str] : null;
return $val;
}

还有一种方法就是在php把错误关闭了代码

 代码如下 复制代码

error_reporting(E_ALL ^ E_NOTICE);

用isset方法

 代码如下 复制代码

$var = isset($_GET['a'])?$_GET['a']:'';

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • php file_get_contents 设置代理抓取页面示例

    file_get_contents函数在php中可以直接打开本地文件也可以直接抓取远程服务器文件,如果简单的采集我们可以使用file_get_contents直接来操作,如果有防采集我们可能需要...2016-11-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • php报错file_get_contents(): php_network_getaddresses问题

    本文章来为各位介绍一篇关于file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known...错误解决办法。 昨天,服务器的DN...2016-11-25
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31