php主动断开与浏览器的连接

发布时间:2020-05-09编辑:脚本学堂
本文分享的这段php代码,可以主动断开与浏览器的连接,使用 Content-Length让浏览器自动断开php的连接,效果不错,有需要的朋友参考下。

本节内容:
php中使用 Content-Length 让浏览器自动断开连接。
Content-Length的作用:浏览器接收到指定Content-Length大小的消息实体后,则会断开与服务器的连接。

相关阅读:php判断客户端浏览器是否断开连接的代码

例子:
 

复制代码 代码示例:
<?php
/**
* 自动断开与浏览器的连接
* edit: www.jb200.com
*/
echo '1234567890'; 
{//断开连接的代码 
$size=ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush(); 
flush(); 

error_log('start:'.date('Y-m-d H:i:s')); 
//断开连接后的执行长时间操作 
sleep(5); 
echo 'test213';//浏览器接收不到了 
error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行. 

把此功能封装成一个类,代码如下:
 

复制代码 代码示例:
<?php
final class HttpConnection{ 
    //只能执行一次的断开连接 
    public static function CloseConnection(){ 
        static $doed = false; 
        if($doed || headers_sent())return; 
        $contents = ''; 
        while(ob_get_level()>1){ 
            $contents = ob_get_contents().$contents; 
            ob_end_clean(); 
        } 
         
        $size=ob_get_length().strlen($contents); 
        $GLOBALS['out_http_data'] = ob_get_contents().$contents; 
         
        //突破PHP运行时限 
        set_time_limit(0); 
        //无视请求断开 
        ignore_user_abort(true); 
         
        //设置正文大小,浏览器收到足够的内容就会断开 
        header("Content-Length: $size"); 
         
        echo $contents; 
         
        //输出正文内容 
        ob_end_flush(); 
        flush(); 
        $doed = true; 
    } 
     
    //只能执行一次的自动断开连接 
    public static function RegisterShutdownClose(){ 
        static $doed = false; 
        if($doed)return; 
        //加一层保护 
        ob_start(); 
        register_shutdown_function(array(__CLASS__,'CloseConnection')); 
        $doed = true; 
    } 

下面看看如何调用以上代码,自动断开与浏览器的连接吧。
例1,
 

复制代码 代码示例:
<?php
date_default_timezone_set('Asia/Shanghai'); 
echo '1234567890'; 
 
HttpConnection::CloseConnection(); 
error_log('start:'.date('Y-m-d H:i:s')); 
 
//断开连接后的执行长时间操作 
sleep(5); 
 
echo 'test213';//浏览器接收不到了 
error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行. 

例2,
 

复制代码 代码示例:
<?php
HttpConnection::RegisterShutdownClose(); 
 
date_default_timezone_set('Asia/Shanghai'); 
echo '1234567890'; 
register_shutdown_function('test'); 
 
function test(){ 
    error_log('start:'.date('Y-m-d H:i:s')); 
 
    //断开连接后的执行长时间操作 
    sleep(5); 
 
    echo 'test213';//浏览器接收不到了 
    error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行. 

说明:
1、实际上连接并未断开,仅是浏览器停止接收信息。
2、指定Content-Length 对于 file_get_contents 没有任何意义;若想使用,请用curl。