为了测试apache的特性,我只允许apache启动两个进程,但是我却已并发1000来访问,因为我想知道超过并发的访问是被如何处理的,我看了apache的源码,apache的listen调用设置的backlog是511,这么说的话,如果至少可以建立511个连接了,但是我用ab测试却发现设置并发1000,也只有100多个连接,怀疑是ab的问题,就自己用php写了个ab,效果还不如人家的ab,同时也就只能建立几十个连接,然后就慢下来了,下面是我的ab.php不知道是谁限制了连接数。
<?php
$url = $argv[$argc – 1];
$arrURL = parse_url($url);
$host = $arrURL[‘host’];
$port = isset($arrURL[‘port’])?$arrURL[‘port’]:80;
$arropt = getopt(‘n:c:’);
$num = $arropt[‘n’];
$curr = $arropt[‘c’];
$i = 0;
$j = 0;
while($i <= $num) {
while(++$j <= $curr) {
echo "i:$i,j:$j\n";
$i++;
$sock[$i] = fsockopen($host, $port, $errno, $errstr, 10);
if( $sock[$i] === false) {
echo "$errstr [ $errno ]\n";
continue;
}
socket_set_blocking($sock[$i],false);
$query = ($arrURL[‘query’]) ? "?" . $arrURL[‘query’] : "";
fputs($sock[$i],"GET " . $arrURL[‘path’] . "$query HTTP/1.0\r\nHost: " . $arrURL[‘host’] . "\r\n\r\n");
}
while(($i >= $num && $j > 0) || ($j >= $curr)) {
$k = 0;
for($k = 0;$k <= $i;$k++) {
if(!$sock[$k]) continue;
if(!feof($sock[$k])) {
fgets($sock[$k],1024);
echo "read data from $k\n";
} else {
fclose($sock[$k]);
$sock[$k] = false;
$j–;
echo "done $k\n";
}
}
}
}
?>
用法:php ab.php -n 1000 -c 1000 http://baidu.com