判断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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
php调用mysql数据 dbclass类
May 07 PHP
php 启动报错如何解决
Jan 17 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
用PHP代码在网页上生成图片
Jul 01 PHP
php遍历解析xml字符串的方法
May 05 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
Oct 10 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实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
js 验证身份证信息有效性
2014/03/28 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
C++面试题目
2013/06/25 面试题
保险专业大专生求职信
2013/10/26 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
建筑工地标语
2014/06/18 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2015年营业员工作总结
2015/04/23 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python