熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

深入解析fsockopen與pfsockopen的區別

2013-11-15 12:23:39  來源: PHP編程 

  按手冊上說這兩個函數的唯一區別是pfsockopen是持續連接fsockopen不是
我寫了個代碼了一下:

復制代碼 代碼如下:
<?php
$data="DDBCFFFFFFFF";
//
$host = ;
$url = "/aaphp";
$pffirst = false;
$times = ;
$startTime = microtime(true);
for ($index = ; $index < $times; $index++) {
 echo httpPost($host$url$data$pffirst)"<hr><br />";
}
$middleTime = microtime(true);
for ($index = ; $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=;
//發包函數
function httpPost($host$url$data$p)
{
global $count;
 $func = $p?"pfsockopen":"fsockopen";

 $conn = $func($host$errno $errstr );
 if (!$conn)
 {
  echo "$errstr ($errno)<br />n";
  return;
 }

 $header = "POST "$url" HTTP/rn";
 $header= "Host : {$host}rn";
 $header= "Contenttype: application/xwwwformurlencodedrn";
 $header= "ContentLength:"strlen($data)"rn";
 $header= "Connection: KeepAlivernrn"; 
 $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:
pfsocket:

如果不注釋:
fsocket:
pfsocket:
可以看出fsocketopen默認每次處理結束後就算協議頭是KeepAlive連接仍然斷掉了
而pfsocketopen在KeepAlive條件下連接可以被下一次重復利用
一次連接發送大量數據時推薦使用pfsocketopen


From:http://tw.wingwit.com/Article/program/PHP/201311/20862.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.