程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 深入解析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";
    $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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved