电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

深入解析fsockopen与pfsockopen的区别


发布日期:2020/12/28
 

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

上一篇:ie与session丢失(新窗口cookie丢失)实测及解决方案

下一篇:执行、获取远程代码返回:file