深入解析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作为Shell脚本语言使用
Oct 09 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
浅谈php和.net的区别
Sep 28 PHP
php强制更新图片缓存的方法
Feb 11 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
php获取汉字拼音首字母的方法
Oct 21 PHP
php关闭warning问题的解决方法
May 17 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
Oct 21 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
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
详解python调度框架APScheduler使用
2017/03/28 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
移动通信行业实习自我鉴定
2013/09/28 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
运动会致辞稿50字
2014/02/04 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
幼儿园个人总结
2015/02/28 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
给校长的建议书作文400字
2015/09/14 职场文书