深入解析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新手上路(十一)
Oct 09 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
PHP远程采集图片详细教程
Jul 01 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
Chrome Web App开发小结
Sep 04 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
学习php开源项目的源码指南
2014/12/21 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
使用Python的内建模块collections的教程
2015/04/28 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
实例详解Python模块decimal
2019/06/26 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
如何使用repr调试python程序
2020/02/28 Python
优秀教师先进事迹
2014/01/22 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
商场租赁意向书
2014/07/30 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
2014年班务工作总结
2014/12/02 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
《开国大典》教学反思
2016/02/16 职场文书
Go web入门Go pongo2模板引擎
2022/05/20 Golang