判断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用户指南-cookies部分
Oct 09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
php实现随机显示图片方法汇总
May 21 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
详解PHP发送邮件知识点
May 06 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 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文件怎么打开 如何执行php文件
2011/12/21 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
node错误处理与日志记录的实现
2018/12/24 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
详细探究Python中的字典容器
2015/04/14 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python简单实例训练(21~30)
2017/11/15 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
小组合作学习反思
2014/02/18 职场文书
销售竞赛活动方案
2014/08/23 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
小学生作文评语集锦
2014/12/25 职场文书
企业安全生产检查制度
2015/08/06 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
Python之基础函数案例详解
2021/08/30 Python
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
基于Python编写一个监控CPU的应用系统
2022/06/25 Python