zoukankan      html  css  js  c++  java
  • PHP Socket编程 之 深入解析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 />
    ";
      return;
     }
    
     $header = "POST ".$url." HTTP/1.1
    ";
     $header.= "Host : {$host}
    ";
     $header.= "Content-type: application/x-www-form-urlencoded
    ";
     $header.= "Content-Length:".strlen($data)."
    ";
     $header.= "Connection: Keep-Alive
    
    "; 
     $header.= "{$data}
    
    ";
    
     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

  • 相关阅读:
    跨表修改数据|查询修改数据|两表联合修改数据
    .net oracle 连接
    型材优化截取初步代码
    JQuery.getJSON 从aspx页面返回JSON数据 .
    asp.net form验证
    ASP.NET读取纯真IP数据库QQWry.Dat,得到地址名称
    防止PHP木马,应在PHP.INI里禁止的一些函数
    sqlserver2005中的数据库日志收缩
    jquery.pagination.js分页插件的运用
    ASP.NET前台代码绑定后台变量方法总结
  • 原文地址:https://www.cnblogs.com/7qin/p/13298658.html
Copyright © 2011-2022 走看看