深入解析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制作静态网站的模板框架(四)
Oct 09 PHP
PHP+DBM的同学录程序(1)
Oct 09 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
php xml 入门学习资料
Jan 01 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
正确的PHP匹配UTF-8中文的正则表达式
May 13 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 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入库和出库
2013/06/25 PHP
PHP云打印类完整示例
2016/10/15 PHP
php实现等比例压缩图片
2018/07/26 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python实现日志按天分割
2019/07/22 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
倡议书范文
2014/04/16 职场文书
给公司的建议书范文
2014/05/13 职场文书
优秀员工演讲稿
2014/05/19 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
感恩教育观后感
2015/06/17 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Python作用域和名称空间的详细介绍
2022/04/13 Python