判断Keep-Alive模式的HTTP请求的结束的实现代码


Posted in PHP onAugust 06, 2011

所以根据EOF就可判断一次请求的结束,下面的代码(PHP)很常见:

// $fp是由fsockopen()产生的句柄 
while(!feof($fp)) { 
echo fgets($fp); 
}

(注:短连接模式是在头部用”Connection: close”标示,长连接用”Connection: keep-alive”标示。目前HTTP/1.0默认使用短连接,HTTP/1.1默认使用长连接。)
而长连接(也称持久连接)模式的HTTP在发送完数据后服务器并不断开连接,而是留着下一次HTTP请求时使用,所以长连接的好处是显而易见的,通过共用一个TCP连接来节省以后请求时建立/断开连接的开销。而EOF是直到这个TCP连接结束(超时或出错)时才会被发送,所以我们就不能使用上面的办法来判断一次HTTP请求的结束了。这也是使用长连接时都会遇到的一个问题。目前判断的方法主要有两种:
(1) 根据头中的Content-Length字段。这个字段标明了正文的长度,我们可以以接收完指定长度的字符为判断结束的依据。
(2) 在没有Content-Length时,根据Transfer-Encoding。有些时候服务器无法确定正文的大小,因为正文可能是动态产生的,所以就不会提供Content-Length了,而是采用chunk编码来一块一块地发送正文。每个chunk块由头部和正文两部分组成,头部中由一个16进制数字指定了正文的长度;最后由一个长度为0的chunk块来表示整个HTTP正文的结束。
下面我用PHP实现了有Content-Length时的判断方式:
1. 获得Content-Length值
$length = 0; 
$line = ''; 
while($line !== "\r\n") { 
$line = fgets($fp); 
if(substr($line, 0, 15) === 'Content-Length:') { 
$length = intval(substr($line, 16)); 
} 
}

2. 获得正文
$sum = 0; 
while($sum < $length) { 
$line = fgets($fp); 
$sum += strlen($line); 
echo $line; 
}
PHP 相关文章推荐
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
PHP实现递归无限级分类
Oct 22 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
Symfony生成二维码的方法
Feb 04 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
PHP接入微信H5支付的方法示例
Oct 28 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
php学习笔记(三)操作符与控制结构
Aug 06 #PHP
PHP几个数学计算的内部函数学习整理
Aug 06 #PHP
PHP缓存技术的使用说明
Aug 06 #PHP
PHP header函数分析详解
Aug 06 #PHP
php 文件上传类代码
Aug 06 #PHP
php代码运行时间查看类代码分享
Aug 06 #PHP
discuz程序的PHP加密函数原理分析
Aug 05 #PHP
You might like
DC动漫人物排行
2020/03/03 欧美动漫
php 不同编码下的字符串长度区分
2009/09/26 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
ie focus bug 解决方法
2009/09/03 Javascript
js 异步处理进度条
2010/04/01 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
Vue的百度地图插件尝试使用
2017/09/06 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
Python玩转Excel的读写改实例
2019/02/22 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
会计应届生的自荐信
2013/12/13 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
python缺失值填充方法示例代码
2022/12/24 Python