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