深入解析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.1rn";
 $header.= "Host : {$host}rn";
 $header.= "Content-type: application/x-www-form-urlencodedrn";
 $header.= "Content-Length:".strlen($data)."rn";
 $header.= "Connection: Keep-Alivernrn"; 
 $header.= "{$data}rnrn";

 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

时间: 2024-09-13 07:49:38

深入解析fsockopen与pfsockopen的区别的相关文章

深入解析fsockopen与pfsockopen的区别_php技巧

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

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

深入解析Close()和Dispose()的区别

很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来说并非如此! 首先,让我们看看我们最常使用的SqlConnection的Close()方法和Dispose()方法的区别: SqlConnection类的Dispose()方法是继承于Component类的,源代码是这样的: public void Dispose() { Dispose(true); //

深入解析StringBuffer和StringBuilder的区别_java

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

解析isset与is_null的区别_php技巧

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

详细解析JavaBeans与Ejb的区别

您现在可能已在使用 Javabeans,但还不了解它.如果有支持 Java 的浏览器,那么,在桌面上使用 Javabeans 就没有限制.使用的 Web 页面可以将 beans 作为小应用程序的一部分.您很快就会和作为浏览器可视部分的 Javabeans 交互,然后,那些 Javabeans 将与服务器上的 EJB 接口.这种能力也可以扩展到因特网和内部网. Javabeans 和 Server beans(通常称为 Enterprise Javabeans (EJB))有一些基本相同之处.它们

解析WeakHashMap与HashMap的区别详解_java

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外已经

深度解析OpenStack与KVM的区别与联系

OpenStack与KVM都是目前IT界比较热门的两个词汇.它们都是开源的,都与Linux有着千丝万缕的关系.但这两者还是有很大的差别呢. OpenStack:开源管理项目 OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目.它不是一个软件,而是由几个主要的组件组合起来完成一些具体的工作.OpenStack由以下五个相对独立的组件构成: OpenStack Compute(Nova)是一套控制器,用于虚拟机计算或使用群组启动虚拟机实例: OpenStack镜像服务(Glan

PHPMailer发送邮件”SMTP 错误:无法连接到 SMTP 主机“

原因分析 出现这个问题说明无法解析 SMTP 主机 <主机 id> 的名称. 解决办法,这个要看邮箱支付不支持pop3发送与接收邮件这个可以邮件官方看看,如QQ邮件 phpmailer error SMTP Error: Could not connect to SMTP host Could not instantiate mail function 弄了半天,原来是不同邮件系统要求的smtp请求不同,但是都允许大写,有些不支持小写,比如网易,腾讯的邮箱. 原来的设置 $mail->S