深入解析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 相关文章推荐
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
php实现的用户查询类实例
Jun 18 PHP
php获取汉字拼音首字母的方法
Oct 21 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 PHP
Yii框架常见缓存应用实例小结
Sep 09 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扩展函数
2006/10/09 PHP
PHP的面试题集
2006/11/19 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
vue 优化CDN加速的方法示例
2018/09/19 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
Python判断telnet通不通的实例
2019/01/26 Python
使用python3构建文件传输的方法
2019/02/13 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
医学生求职自荐信
2013/10/25 职场文书
学习自我鉴定
2014/02/01 职场文书
陈欧广告词
2014/03/14 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
工会工作个人总结
2015/03/03 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技