深入解析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中使用Oracle数据库(4)
Oct 09 PHP
PHP语法速查表
Dec 06 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
深入理解php的MySQL连接类
Jun 07 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
php生成扇形比例图实例
Nov 06 PHP
10个简化PHP开发的工具
Dec 25 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 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
FCK调用方法..
2006/12/21 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
layui文件上传实现代码
2017/05/20 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
Python骚操作之动态定义函数
2019/03/26 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
实习单位接收函
2014/01/11 职场文书
物流业务员岗位职责
2014/02/08 职场文书
党课培训主持词
2014/04/01 职场文书
房地产广告策划方案
2014/05/15 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技