fsockopen VS pfsockopen
前几天cyberty说起pfsockopen,我还不是很了解,大家平时用的最多的应该是fsockopen,事实上我基本没用过pfsockopen
那么这两个函数有什么区别呢?先看一下手册上的介绍:
resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )
resource pfsockopen ( string hostname [, int port [, int &errno [, string &errstr [, float timeout]]]] )
两函数的参数完全一致,从手册上能看出来的区别只是一句话It is the persistent version of fsockopen().
或许此时你想到了mysql_connect 和 mysql_pconnect,经验告诉我们mysql_pconnect并没有预期的效果。那么psocketopen会是什么效果呢?
给一些说明: 第一行的1~5代表测试次数的序号,fsockopen 和 pfsockopen在各种情况分别测试了5次;其他数字是执行时间(以秒为单位)。
从测试结果来看pfsockopen在同一次请求中大量反复使用的连接具有复用效果,但是在需要获取内容时表现不佳。
总体来看区别不是很大,或许需要更大量的测试数据来支持这一结论。
下面是测试代码,根据需要改动注释代码:
ini_set("display_errors", "On");
error_reporting(E_ALL);
set_time_limit(600);
$t1 = microtime(true);
$err = 0;
echo "[code]\n";
$func = isset($_GET['p']) ? "pfsockopen" : "fsockopen";
for ($i = 0; $i < 50; $i++) {
$fp = $func("www.163.com", 80);
if(!is_resource($fp)) {
echo "conn error\n";
$err++;
continue;
}
fwrite($fp, "GET / HTTP/1.1\r\n\r\n");
$s = stream_get_contents($fp);
// fclose($fp);
echo strlen($s);
echo "\n";
flush();
}
$t2 = microtime(true);
echo "time: ".($t2-$t1)."\n";
echo "err: ".$err;
