判断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 mb_convert_encoding 获取字符串编码类型实现代码
Apr 26 PHP
php 验证码实例代码
Jun 01 PHP
有关php运算符的知识大全
Nov 03 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
PHP中实现获取IP和地理位置类分享
Feb 10 PHP
详谈PHP编码转换问题
Jul 28 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
Laravel框架下的Contracts契约详解
Mar 17 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python在控制台输出进度条的方法
2015/06/20 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
python实现用户答题功能
2018/01/17 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python3 map函数和filter函数详解
2019/08/26 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
python实现126邮箱发送邮件
2020/05/20 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
函授本科自我鉴定
2013/11/03 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
pytorch中的 .view()函数的用法介绍
2022/03/17 Python