判断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编程中字符串处理的5个技巧小结
Nov 13 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
php存储过程调用实例代码
Feb 03 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
微信支付开发交易通知实例
Jul 12 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
php实现登录页面的简单实例
Sep 29 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 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 新手入门教程
2009/08/03 PHP
用php解析html的实现代码
2011/08/08 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
Python Pandas 箱线图的实现
2019/07/23 Python
Python:slice与indices的用法
2019/11/25 Python
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
出纳员的岗位职责
2014/02/22 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
党校毕业心得体会
2014/09/13 职场文书
门面房租房协议书
2014/12/01 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
网络妈妈观后感
2015/06/08 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
初一语文教学反思
2016/03/03 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA