php 中断请求,php主动断开与浏览器的连接

本节内容:

php中使用 Content-Length 让浏览器自动断开连接。

Content-Length的作用:浏览器接收到指定Content-Length大小的消息实体后,则会断开与服务器的连接。

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

例子:

复制代码 代码示例:

/**

* 自动断开与浏览器的连接

* edit: www.jbxue.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秒后执行.

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

复制代码 代码示例:

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,

复制代码 代码示例:

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,

复制代码 代码示例:

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值