深入解析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 socket方式提交的post详解
Jul 19 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
Yii清理缓存的方法
Jan 06 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 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 分页类实现代码
2009/12/03 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
Python 连连看连接算法
2008/11/22 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python 进程的几种创建方式详解
2019/08/29 Python
Python程序慢的重要原因
2020/09/04 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
Python通过字典映射函数实现switch
2020/11/06 Python
Python实现区域填充的示例代码
2021/02/03 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
展会邀请函范文
2014/01/26 职场文书
劳资协议书范本
2014/04/23 职场文书
党员干部一句话承诺
2014/05/30 职场文书
招标承诺书
2014/08/30 职场文书
PHP解决高并发问题
2021/04/01 PHP
MySQL查询学习之基础查询操作
2021/05/08 MySQL
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL