本节内容:
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。