判断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 相关文章推荐
dedecms中显示数字验证码的修改方法
Mar 21 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
PHP中读写文件实现代码
Oct 20 PHP
PHP简洁函数(PHP简单明了函数语法)
Jun 10 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 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捕获Fatal error错误的方法
2014/06/11 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
python 提取文件的小程序
2009/07/29 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
浅谈Python处理PDF的方法
2017/11/10 Python
对python中的logger模块全面讲解
2018/04/28 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Linux中如何用命令创建目录
2016/12/02 面试题
小学班主任寄语大全
2014/04/04 职场文书
家具商场的活动方案
2014/08/16 职场文书
2014年教务处工作总结
2014/12/03 职场文书
辩护词范文大全
2015/05/21 职场文书
感谢师恩主题班会
2015/08/17 职场文书
详解Python描述符的工作原理
2021/06/11 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python