Zen*_*thM 13 php apache http keep-alive
我试图建立一个从Silverlight应用程序到PHP页面的HTTP持久连接(即无需创建每个HTTP请求新的TCP连接)由Apache服务器托管.
为此,我需要Web服务器发送其HTTP响应,并将"Connection"标头设置为"Keep-alive".客户端,似乎没有要任何问题,因为由Silverlight中提供的网络API基本上是浏览器的网络capabilies的包装,从我读过:所以如果浏览器支持HTTP 1.1和连接:保持活动默认情况下,它的请求,没关系.Content-Length也已明确定义,因此服务器知道何时必须发送响应.但是,服务器对PHP请求的响应系统地将"连接:"设置为"关闭",从而结束连接并阻止持久连接.
我已经尝试了一些解决这个问题的方法:不同的方法(GET和POST),在我的脚本开头用以下PHP代码显式给出响应的"Connection:keep-alive":
header("Connection: Keep-alive");
Run Code Online (Sandbox Code Playgroud)
后者将预期的标头添加到响应中,这很好,但是附加的"连接:关闭"仍然会在响应标头中添加.
它是PHP或Apache的一个特性强制执行"关闭"(出于某些安全性或性能目的,我猜)或者我只是在这里遗漏了一些东西?
提前致谢.
PS:通过嗅探数据包,我注意到没有多少网站使用"保持活动"并重新建立TCP连接.Keepalive不是HTTP 1.1下的默认和首选行为吗?
fav*_*avo 25
Keep-Alive功能不适用于持久连接.
Keep-Alive旨在减少网站的连接数量.不是为网页中的每个图像/ css/javascript创建新连接,而是使用相同的连接重新发出许多请求.
有些设置也会在Apache中阻止这种情况,例如连接上的最大请求数或请求之间的超时.这也会非常快速地占用您的资源,因为每个连接都需要自己的线程.
你应该切换到另一种解决方案,这是为这种工作而做的.
对于保持连接打开的服务,您可以查看http://orbited.org和http://twistedmatrix.com/trac/
由于PHP不管理HTTP连接,因此无法更改此设置.您需要在服务器中设置它.例如,如果使用mod_php,可以在Apache中启用这样的keep-alive,
KeepAlive On
Run Code Online (Sandbox Code Playgroud)