判断Keep-Alive模式的HTTP请求的结束的实现代码

2015-01-24信息快讯网

在使用短连接方式时,每个HTTP请求对应一个TCP连接,请求完成后连接立即断开,服务器返回EOF。

所以根据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 判断数组是几维数组
ajax取消挂起请求的处理方法
PHP中使用cURL实现Get和Post请求的方法
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
使用php判断浏览器的类型和语言的函数代码
php安全开发 添加随机字符串验证,防止伪造跨站请求
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
php中选择什么接口(mysql、mysqli)访问mysql
PHP调用Linux的命令行执行文件压缩命令
mysqli_set_charset和SET NAMES使用抉择及优劣分析
php判断上传的Excel文件中是否有图片及PHPExcel库认识
PDO版本问题 Invalid parameter number: no parameters were bound
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Could not load type System.ServiceModel.Activation.HttpModule解决办法
PHP获取http请求的头信息实现步骤
php获取通过http协议post提交过来xml数据及解析xml
PHP判断文件是否存在、是否可读、目录是否存在的代码
shopex主机报错误请求解决方案(No such file or directory)
php记录日志的实现代码
php学习笔记(三)操作符与控制结构
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
linux下使用ThinkPHP需要注意大小写导致的问题
linux下为php添加curl扩展的方法
php 判断访客是否为搜索引擎蜘蛛的函数代码
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
php守护进程 加linux命令nohup实现任务每秒执行一次
在php中判断一个请求是ajax请求还是普通请求的方法
php设计模式 Chain Of Responsibility (职责链模式)
php判断输入不超过mysql的varchar字段的长度范围
php错误提示failed to open stream: HTTP request failed!的完美解决方法
PHP文件打开、关闭、写入的判断与执行代码
The specified CGI application misbehaved by not returning a complete set of HTTP headers
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
php模拟asp中的XmlHttpRequest实现http请求的代码
WordPress判断用户是否登录的代码
©2014-2024 dbsqp.com