深入解析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 相关文章推荐
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
标准PHP的AES加密算法类
Mar 12 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
PHP错误机制知识汇总
Mar 24 PHP
Yii2框架中日志的使用方法分析
May 22 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
php中try catch捕获异常实例详解
Aug 06 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
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
2010/02/07 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
Python之PyUnit单元测试实例
2014/10/11 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python 利用toapi库自动生成api
2020/10/19 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
计算机本科生自荐信
2013/10/15 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python
python 使用pandas读取csv文件的方法
2022/12/24 Python