php输出缓冲控制

2021-03-08

输出缓冲区内容到浏览器

// 丢弃输出缓冲区中的内容
ob_clean()

//打开输出缓冲
ob_start()

# 输出数据,输出的数据将全部进入输出缓冲区

/*
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。
将当前为止程序的所有输出发送到用户的浏览器,函数不会对服务器或客户端浏览器的缓存模式产生影响。
因此必须同时使用ob_flush()和flush()函数来刷新输出缓冲
*/
flush()
//冲刷出输出缓冲区中的内容
ob_flush()
//冲刷出输出缓冲区内容并关闭缓冲区
ob_end_flush()
# 3中刷新缓冲使用任意一种都可以

每次写入缓冲区的内容直接输出到浏览器

// 丢弃输出缓冲区中的内容
ob_clean()

// 打开输出缓冲
ob_start()

// 打开/关闭绝对刷送,绝对刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对flush()的显式调用。
ob_implicit_flush(int $flag = true)

# 输出数据,输出的数据将直接刷新到浏览器

压缩输出缓冲区内容

/*
打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。
*/
ob_start('ob_gzhandler')
/*
在ob_start中使用的用来压缩输出缓冲区中内容的回调函数,以方便将gz编码的数据发送到支持压缩页面的浏览器,
在真正发送压缩过的数据之前,该函数会确定(判定)浏览器可以接受哪种类型内容编码然后返回相应的输出。 
所有可以发送正确头信息表明他自己可以接受压缩的网页的浏览器,都可以支持;函数需要zlib扩展
ob_gzhandler(string $buffer,int $mode)
*/

# 输出数据,输出的数据将全部进入输出缓冲区

//清空缓冲区并关闭输出缓冲区
ob_end_flush()

获取写入缓冲区的数据

/*
打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。
*/
ob_start(callable $output_callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS)
    output_callback 指定一个回调函数。当输出缓冲区被(ob_flush(),ob_clean()或者相似的函数)冲刷或者被清洗的时候,或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。当调用output_callback时,它将收到输出缓冲区的内容作为参数并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果output_callback返回false,原来的输入内容被直接送到浏览器。
        回调函数:handler(string $buffer , int $phase = ?):string 
            buffer 输出缓冲区中的内容
            phase 比特掩码
    chunk_size 当起缓冲区的长度等于或超过chunk_size的输出操作时,缓冲区都会被刷送。 默认值0则仅在最后被调用。
    flags 代表了一个掩码位,用来控制对缓冲区的操作

# 输出数据,输出的数据将全部进入输出缓冲区

//获取输出缓冲区的内容
$data = ob_get_contents();

//获取输出缓冲区内容的长度
$length = ob_get_length();

//清空缓冲区并关闭输出缓冲区
ob_end_clean()
/*
打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。
*/
ob_start(callable $output_callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS)
    output_callback 指定一个回调函数。当输出缓冲区被(ob_flush(),ob_clean()或者相似的函数)冲刷或者被清洗的时候,或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。当调用output_callback时,它将收到输出缓冲区的内容作为参数并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果output_callback返回false,原来的输入内容被直接送到浏览器。
        回调函数:handler(string $buffer , int $phase = ?):string 
            buffer 输出缓冲区中的内容
            phase 比特掩码
    chunk_size 当起缓冲区的长度等于或超过chunk_size的输出操作时,缓冲区都会被刷送。 默认值0则仅在最后被调用。
    flags 代表了一个掩码位,用来控制对缓冲区的操作

# 输出数据,输出的数据将全部进入输出缓冲区

//得到当前缓冲区的内容并删除当前输出缓出缓冲区,质上是一起执行了 ob_get_contents() 和 ob_end_clean()
$data = ob_get_clean()

结束响应后继续执行耗时任务

/*
冲刷(flush)所有响应的数据给客户端并结束请求
使得客户端结束连接后,可以继续运行需要大量时间运行的任务。
在fastcgi_finish_request()之后,脚本仍然会占用FPM进程。只要会话处于活动状态,它们就会被锁定。
这意味着后续的请求将被阻塞,直到会话关闭;您应该尽快调用session_write_close()结束会话锁。
这也适用于所有其他锁定技术,例如flock或数据库锁定。只要锁是活动的,随后的请求就可能被阻塞
*/
fastcgi_finish_request():bool

输出文件内容到浏览器

方法1

// 丢弃输出缓冲区中的内容
ob_clean()

//打开输出缓冲
ob_start()

// 读取文件并写入到输出缓冲,返回字节数
readfile(string $filename);
    filename 要读取的文件名。

/*
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。
将当前为止程序的所有输出发送到用户的浏览器,函数不会对服务器或客户端浏览器的缓存模式产生影响。
因此必须同时使用ob_flush()和flush()函数来刷新输出缓冲
*/
flush()
//冲刷出输出缓冲区中的内容
ob_flush()
//冲刷出输出缓冲区内容并关闭缓冲区
ob_end_flush()
# 3种刷新缓冲使用任意一种都可以

方法2

// 丢弃输出缓冲区中的内容
ob_clean()

//打开输出缓冲
ob_start()

$fp = fopen($filename);
// 从文件指针当前的位置读取到EOF并把结果写到输出缓冲区,错误返回false
fpassthru($fp);
fclose($fp);

/*
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。
将当前为止程序的所有输出发送到用户的浏览器,函数不会对服务器或客户端浏览器的缓存模式产生影响。
因此必须同时使用ob_flush()和flush()函数来刷新输出缓冲
*/
flush()
//冲刷出输出缓冲区中的内容
ob_flush()
//冲刷出输出缓冲区内容并关闭缓冲区
ob_end_flush()
# 3中刷新缓冲使用任意一种都可以

 

{/if}