深入解析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 XML操作类DOMDocument
Dec 16 PHP
php 中的4种标记风格介绍
May 10 PHP
PHP输入流php://input介绍
Sep 18 PHP
php判断当前用户已在别处登录的方法
Jan 06 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
php生成图片缩略图功能示例
Feb 22 PHP
浅谈PHP的反射API
Feb 26 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
一个捕获函数输出的函数
2007/02/14 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js下弹出窗口的变通
2007/04/18 Javascript
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
js控制frameSet示例
2013/09/10 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python itertools模块详解
2015/05/09 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
Python实现时间序列可视化的方法
2019/08/06 Python
Python Celery多队列配置代码实例
2019/11/22 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
Unix如何添加新的用户
2014/08/20 面试题
作文批改评语大全
2014/04/23 职场文书
还款承诺书范文
2014/05/20 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js