深入解析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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
PHP字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
PHP网站备份程序代码分享
Jun 10 PHP
php标签云的实现代码
Oct 10 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
PHP 实现缩略图
Mar 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 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
javascript调试说明
2010/06/07 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
详解vue 组件注册
2020/11/20 Vue.js
pycharm 使用心得(四)显示行号
2014/06/05 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
django API 中接口的互相调用实例
2020/04/01 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
餐饮营销方案
2014/02/23 职场文书
小学校长汇报材料
2014/08/20 职场文书
三八妇女节标语
2014/10/09 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
golang import自定义包方式
2021/04/29 Golang
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android