判断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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
php数据访问之增删改查操作
May 09 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
php实现websocket实时消息推送
Mar 30 PHP
ThinkPHP5 验证器的具体使用
May 31 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 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 mysql数据库操作分页类
2008/06/04 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
5 cool javascript apps
2007/03/24 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
通过修改referer下载文件的方法
2008/05/11 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python实现网站表单提交和模板
2019/01/15 Python
Python实现FM算法解析
2019/06/18 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
python实现五子棋程序
2020/04/24 Python
python openpyxl模块的使用详解
2021/02/25 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
党校培训思想汇报
2014/01/03 职场文书
协议书与合同的区别
2014/04/18 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
工程款催款函
2015/06/24 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL