判断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 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
劣质的PHP代码简化
Feb 08 PHP
PHP中的错误处理、异常处理机制分析
May 07 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php获取文件内容最后一行示例
Jan 09 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php字符串操作常见问题小结
Oct 11 PHP
PHP ADODB实现分页功能简单示例
May 25 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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+java实现自动新闻滚动窗口
2006/10/09 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python中列表与元组的乘法操作示例
2018/02/10 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python分布式计算dispy的使用详解
2019/12/22 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
python 实现汉诺塔游戏
2020/11/28 Python
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
硕士研究生个人求职信
2013/12/04 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
应聘教师自荐书
2014/06/16 职场文书
高中综合实践活动总结
2014/07/07 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
2015年共青团工作总结
2015/05/15 职场文书
高中信息技术教学反思
2016/02/16 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
windows server2008 开启端口的实现方法
2022/06/25 Servers