深入解析fsockopen与pfsockopen的区别


Posted in PHP onJuly 05, 2013

按手册上说,这两个函数的唯一区别是,pfsockopen是持续连接,而fsockopen不是.
我写了个代码了一下:

<?php 
$data="1,0,721,73,1,0,0,43290000,0,60D81D509BC00451,3,FFFFFFFF";
//http://10.144.99.114/SANEX_NEW/modules/subscribemanager/test.php
$host = '127.0.0.1';
$url = "/aa.php";
$pffirst = false;
$times = 1000;
$startTime = microtime(true);
for ($index = 0; $index < $times; $index++) {
 echo httpPost($host,$url,$data,$pffirst)."<hr><br />";
}
$middleTime = microtime(true);
for ($index = 0; $index < $times; $index++) {
 echo httpPost($host,$url,$data,!$pffirst)."<hr><br />";;
}
$endTime = microtime(true);
 echo ($pffirst?"pfsocket":"fsocket").":".($middleTime-$startTime);
 echo "<br />";
 echo ($pffirst?"fsocket":"pfsocket").":".($endTime-$middleTime);$count=0;
//发包函数
function httpPost($host,$url,$data,$p)
{
global $count;
 $func = $p?"pfsockopen":"fsockopen";
 $conn = $func($host,80,$errno, $errstr, 30);
 if (!$conn) 
 {
  echo "$errstr ($errno)<br />\n";
  return;
 }
 $header = "POST ".$url." HTTP/1.1\r\n";
 $header.= "Host : {$host}\r\n";
 $header.= "Content-type: application/x-www-form-urlencoded\r\n";
 $header.= "Content-Length:".strlen($data)."\r\n";
 $header.= "Connection: Keep-Alive\r\n\r\n"; 
 $header.= "{$data}\r\n\r\n";
 fwrite($conn,$header);
 $count++;
 echo $count.' '.$header."<br /><br />";
 $resp='';
 //while (!feof($conn)) {
 // $resp .= fgets($conn);
 //}
 //fclose($conn);
 return $resp;
}
?>

结果发现:
代码的倒数第二行,如果把//fclose($conn);注释掉,结果是:
fsocket:11.04693198204
pfsocket:0.34867787361145

如果不注释:
fsocket:12.509312152863
pfsocket:11.120275974274
可以看出,fsocketopen默认每次处理结束后,就算协议头是Keep-Alive,连接仍然断掉了.
而pfsocketopen在Keep-Alive条件下,连接可以被下一次重复利用.
一次连接发送大量数据时,推荐使用pfsocketopen
PHP 相关文章推荐
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
Smarty模板语法详解
Jul 20 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 #PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 #PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
解析php类的注册与自动加载
Jul 05 #PHP
php 注册时输入信息验证器的实现详解
Jul 05 #PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 #PHP
You might like
分享PHP header函数使用教程
2013/09/05 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
现金会计岗位职责
2013/12/05 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android