判断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 session常见问题集锦及解决办法总结
Mar 18 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
PHP生成不重复随机数的方法汇总
Nov 19 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
php生成数字字母的验证码图片
Jul 14 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
php写入文件不覆盖的实例讲解
Sep 17 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
分享php邮件管理器源码
2016/01/06 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
Angular网络请求的封装方法
2018/05/22 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
python 实现多维数组转向量
2019/11/30 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
pytorch 求网络模型参数实例
2019/12/30 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
美国网上订购鲜花:FTD
2016/09/23 全球购物
银行职员思想汇报
2013/12/31 职场文书
三八活动策划方案
2014/08/17 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
新学期开学标语2015
2015/07/16 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
java版 联机五子棋游戏
2022/05/04 Java/Android