Apache配置文件中有三个关于KeepAlive的配置指令:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
一般来讲,http请求是一次请求完毕就关闭连接的,但是有些时候,一个apache只有少数的固定的几个或几十个机器频繁的访问,这时,每次访问都重新建立tcp连接,感觉有些无聊,这时就用到KeepAlive的相关设置了:
当KeepAlive 为 On,如果http请求头明确说明:Connection:keep-alive ;则一次请求结束后,如果该连接使用的次数没有超过MaxKeepAliveRequests ,服务器并不立即主动断开连接,而是等待KeepAliveTimeout 指定的时间,这时,如果客户端没有再发起http请求,则关闭连接;如果在KeepAliveTimeout时间内,客户端又使用该连接做http请求,则省去了重新建立tcp连接的消耗了。
就上面的设置而言:
———————————-
如果客户端发送http请求头:
…
Connection:keep-alive
…
则服务器端相应的http头为:
…
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
…
————————————
如果客户端发送http请求头:
…
Connection:close
…
则服务器端响应的http头为:
…
Connection:close
…
并且服务器端主动关闭连接
================================================
如果服务器端设置为:KeepAlive Off
则不管客户端的http请求头如何设置,服务器端总是每次连接只处理一个请求,并立即主动关闭,响应的http头为:
…
Connection:close
…
———————————————-
下面附一段代码:
<?php
main();
function main() {
$host = "ljj.com";
$port = 80;
$url = "/";
$fp = fsockopen($host, $port ,$errno, $errstr, 10);
if($fp === false) {
die($errstr);
}
$str = "GET / HTTP/1.1\nHost: ljj.cn\nConnection:keep-alive\n\n";
$i = 0;
while($i++ < 3) {
$len = fputs($fp,$str);
if($len === false) { // 这里这么判断是没有用的,因为如果服务器端单向关闭,该连接没有完全断开,则还是可以写数据的,只是没有响应而已
die("fp error\n");
}
$out = fread($fp,2048);
echo "$i:$out\n";
}
fclose($fp);
}
?>
这段代码说明了多次请求可以使用同一条连接(在服务器端KeepAlive On的情况下)