判断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代码
Sep 10 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP5.3新特性小结
Feb 14 PHP
PHP SESSION机制的理解与实例
Mar 22 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 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
三个类概括PHP的五种设计模式
2012/09/05 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
php 启动报错如何解决
2014/01/17 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
详解Python迭代和迭代器
2016/03/28 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
2019年分享net面试的经历和题目
2016/08/07 面试题
初中物理教学反思
2014/01/14 职场文书
护理中职生求职信范文
2014/02/24 职场文书
法制教育演讲稿
2014/09/10 职场文书
教师个人发展总结
2015/02/11 职场文书
办公室岗位职责范本
2015/04/11 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
python 字典和列表嵌套用法详解
2021/06/29 Python
浅谈MySQL函数
2021/10/05 MySQL
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js