判断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数据库操作类
Sep 02 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
PHP使用CURL实现多线程抓取网页
Apr 30 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
对laravel的session获取与存取方法详解
Oct 08 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
探讨如何把session存入数据库
2013/06/07 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
php 修改密码实现代码
2017/05/24 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
常用的 JS 排序算法 整理版
2018/04/05 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
python3.6编写的单元测试示例
2019/08/17 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
python随机生成库faker库api实例详解
2019/11/28 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
社团文化节邀请函
2014/01/10 职场文书
《猫》教学反思
2014/02/26 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
个人政治思想总结
2015/03/05 职场文书
党支部半年考察意见
2015/06/01 职场文书
小时代观后感
2015/06/10 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
Java实现二分搜索树的示例代码
2022/03/17 Java/Android