<?php

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会是什么效果呢?

下面我做了几组测试,每组测试时反复50次连接:
socket

给一些说明: 第一行的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;

Tags: ,

Leave a Reply