深入解析fsockopen与pfsockopen的区别

按手册上说,这两个函数的唯一区别是,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

(0)

相关推荐

  • 基于php socket(fsockopen)的应用实例分析

    fsockopen函数能够运用,首先要开启php.ini中的allow_url_open=on;fsockopen是对socket客户端代码的封装,该函数中封装了socket_create,socket_connect.服务器端代码:server.php 复制代码 代码如下: <?phperror_reporting(E_ALL);set_time_limit(0);$address = '127.0.0.1';$port = 10008;//创建端口if (($sock = socket_cr

  • php fsockopen中多线程问题的解决办法[翻译]

    问题: 有没有办法在php中实现多线程呢? 假设你正在写一个基于多台服务器的php应用,理想的情况时同时向多台服务器发送请求,而不是一台接一台. 可以实现吗? 回答: 当有人想要实现并发功能时,他们通常会想到用fork或者spawn threads,但是当他们发现php不支持多线程的时候,大概会转换思路去用一些不够好的语言,比如perl. 其实的是大多数情况下,你大可不必使用fork或者线程,并且你会得到比用fork或thread更好的性能. 假设你要建立一个服务来检查正在运行的n台服务器,以确

  • php fsockopen伪造post与get方法的详解

    fsockopen 伪造 post和get方法哦,如果你正在找 伪造 post和get方法的php处理代码这款不错哦. 复制代码 代码如下: <?php//fsocket模拟post提交$purl = "http://localhost/netphp/test2.php?uu=rrrrrrrrrrrr";print_r(parse_url($url));sock_post($purl,"uu=55555555555555555");//fsocket模拟get

  • 发布一个用PHP fsockopen写的HTTP下载的类

    如果支持打开远程内容的选项的话,实际上php用fopen或file_get_contents都能获得一个网页的内容,但是默认的函数有个不足的地方就是无法获取HTTP头,这在一些特殊的应用中很不方便,如,有一个链接: http://www.abc.com/showvd.asp?id=18 假如它返回的是一个图片,用默认函数就很难识别,但如果通过HTTP应答头来判断就简单多了,此外如果对方通过 Refer 来防盗链的话,也是无法获取的,用HTTP类就能完美解决这些问题,而且速度也相差无几. 使用方法

  • 防止本地用户用fsockopen DDOS攻击对策

    原因 php脚本部分源码: 复制代码 代码如下: $fp = fsockopen("udp://$ip", $rand, $errno, $errstr, 5); if($fp){ fwrite($fp, $out); fclose($fp); php脚本中的 fsockopen 函数,对外部地址,通过UDP发送大量的数据包,攻击对方. 应对 可通过 php.ini ,禁用 fsockopen 函数,及使用Windows 2003的 安全策略 屏蔽本机的UDP端口. 禁用函数 查找到

  • 浅析虚拟主机服务器php fsockopen函数被禁用的解决办法

    一.如何禁用fsockopen()下面是两种常用的禁用fsockopen的方法.1.修改php.ini,将 disable_functions = 后加入 fsockopen 2.修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off 二.如何解决fsockopen函数被禁用1.如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen.具体操作:搜索程序中的字符串 fsockopen( 替换

  • 不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题

    所以就怀疑是否编码问题,或者文件权限问题,或者是不是函数不支持问题,经过排查发现原来是万网的L1主机不支持fsockopen,在文件uc_client/client.php中的uc_fopen中出现了问题,这里的代码是这样: 复制代码 代码如下: function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) { $re

  • 深入解析fsockopen与pfsockopen的区别

    按手册上说,这两个函数的唯一区别是,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的fsockopen、pfsockopen函数被主机商禁用的解决办法

    也许fsockopen.pfsockopen函数的确存在着安全的隐患,但是我们却已经无从考证,这都是IDC商说的,不管是什么原因吧,反正他们是把这两个函数禁用了,那么如何解决呢,下面是小编整理的方法,希望对用到的同学有一定的参考. 解决方法如下: 一.使用stream_socket_client()替代 服务器同时禁用了fsockopen.pfsockopen,那么用其他函数代替,如stream_socket_client().注意:stream_socket_client()和fsockope

  • 解析C++各种变量及区别

    目录 一.分类 二.作用域 三.存储区域 四.总结 在日常开发中,我们经常使用变量,常量,像下面的代码: int ser_1; // 全局变量 const int ser_2; // 全局常量 static int ser_3; // 静态变量 void main(){ int serven_1; // 局部变量 const int serven_2; // 局部常量 static int serven_3; // 局部静态变量 func(serven_1); } void func(int p

  • vue数据监听解析Object.defineProperty与Proxy区别

    目录 前言 Object.defineProperty 与 Proxy 的区别 在使用上的差异 总结与思考 前言 总能深深感觉到自己能力有限,写这篇文章的目的纯粹是因为发现在实际工作中,和一些小伙伴交流时发现,虽然有些小伙伴大概知道 vue2 与 vue3 的区别,但并没有去进一步思考一些深一点的东西.尽管能力有限,但想着自己在起步时候的艰难,就想着分享一下自己的一些看法,虽然不一定有多深入,但能引起大家的一些思考也是好的. Object.defineProperty 与 Proxy 的区别 其

  • 深入解析StringBuffer和StringBuilder的区别

    做项目中经常用到String和StringBuilder,String可以用"+"来对字符串进行拼接,StringBuilder用append进行拼接,一直不明白既然可以用String,问什么还要用StringBuilder.尽管在做数据库查询的时候,习惯性的用了StringBuilder对查询语句进行拼接,但仍然不知道原因.今天看视频的时候,又看到了StringBuffer,感觉用法又差不多,所以特意查了一下这些东西的区别.归纳如下:1.在执行速度方面的比较:StringBuilde

  • 解析isset与is_null的区别

    isset和is_null啥区别,看手册上讲的话, isset和is_null的功能几乎完全"相反的一样"..是不是isset就是一个is_null的相反的别名?诶, 要说区别, 那还真的是很多~ 一切的不同都是因为: is_null是函数, isset是语句.isset是语句, 和echo, print一样, 是PHP本身的一种语言结构.而is_null是函数, 和我们一般的函数一样, 可以做为可变函数调用.你也许会说, 好了,好了,我知道函数和语句的区别, 但到底是TMD什么区别?

  • 解析WeakHashMap与HashMap的区别详解

    WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a.b两个对象,当HashMap  remove掉a 并且将a.b都指向null时,WeakHashMap中的a将自动被回收掉.出现这个状况的原因是,对于a对象而言,当HashMap  remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经

  • 通过实例解析POJO和JavaBean的区别

    POJO POJO(Plain Ordinary Java Object)即普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO. 实际意义就是普通的JavaBeans(简单的实体类),特点就是支持业务逻辑的协助类. POJO类的作用是方便程序员使用数据库中的数据表,对于程序员来说,可以很方便的将POJO类当作对象来进行使用,也可以方便的调用其get,set方法. 但不允许有业务方法,也不能携带有connection之类的方法,即不包含业务逻辑或持久逻辑等. Jav

  • mybatis collection和association的区别解析

    目录 1.collection标签 1.1 相关代码和运行结果 1.2 collection部分源码解析 1.3 <collection>和<association>的相同的和不同点 最后 1.collection标签 说到mybatis的collection标签,我们肯定不陌生,可以通过它解决一对多的映射问题,举个例子一个用户对应多个系统权限,通过对用户表和权限表的关联查询我们可以得到好多条记录,但是用户信息这部分在多条记录中是重复的,只有权限不同,我们需要把这多条权限记录映射到

  • 从源码角度简单看StringBuilder和StringBuffer的异同(全面解析)

    概述 StringBuilder和StringBuffer是两个容易混淆的概念,本文从源码入手,简单看二者的异同. 容易知道的是,这两者有一个是线程安全的,而且线程安全的那个效率低. java doc里面的说明 java doc是写源码的人写的注释,先看java doc. StringBuilder A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with

随机推荐