我正在开发一个可以同时连接到多个URL的网站(我们希望每分钟达到600个),无论我尝试什么,总有数千个TIME_WAIT仍然打开。我知道这些对于TCP连接至关重要,但它们正在使用所有可用的端口。 PHP没有SO_REUSEPORT,SO_REUSEADDR不适用于远程连接。这是代码的开头:
$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($s, SOL_SOCKET, SO_LINGER,array('l_linger'=>0, 'l_onoff'=>0)); //I have tried l_onoff=1
socket_set_option($s, SOL_SOCKET, SO_RCVTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_SNDTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_KEEPALIVE,0);
socket_set_option($s, SOL_SOCKET, SO_REUSEADDR,1);
socket_set_nonblock($s);
socket_bind($s,$ip,0);
socket_connect($s,$host,$port);
$ s进入一个包含所有挂起写入的数组,在写入后我们调用socket_shutdown($ s,1);关闭套接字上的写入。然后读完后我们:
socket_shutdown($s,2); socket_close($s);
所有读取和写入都是在while循环中完成的,循环最多有12个并发连接,如果没有命中,则继续运行并继续向数组添加另一个URL。每个循环都调用socket_select,超时为0。
有没有人有任何建议?我想提高速度并减少netstat中出现的TIME_WAIT。
谢谢, 詹姆斯哈蒂格
答案 0 :(得分:4)
您可以发送HTTP标头Connection: close
以及您的请求,这会导致服务器在向您发送请求后发送TCP FIN。因为另一方发送第一个FIN,它将是另一方在TIME_WAIT中等待,而不是你。
答案 1 :(得分:1)
如果您想在Linux上减少TIME_WAIT
,可以修改proc
设置:
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
这会将超时更改为30秒。请注意TIME_WAIT
是标准TCP / IP行为的一部分 - 除非您真的缺乏资源,否则我不会这么做。