深入解析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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
用PHP查询域名状态whois的类
Nov 25 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 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获取Google AJAX Search API 数据的代码
2010/03/12 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
abstract是什么意思
2012/02/12 面试题
销售总监岗位职责
2014/01/04 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
关于赌博的检讨书
2014/01/24 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
机修工工作职责
2014/02/21 职场文书
新闻发布会主持词
2014/03/28 职场文书
解除施工合同协议书
2014/10/17 职场文书
单位租房协议范本
2014/12/03 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android