PHP 版的ab

为了测试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$errstr10
);
                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

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据