尽管SO_LINGER,关闭等数以万计的TIME_WAIT

Jam*_*tig 5 php sockets

我正在开发一个可以同时连接到多个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);
Run Code Online (Sandbox Code Playgroud)

$ s进入一个包含所有挂起写入的数组,在写入后我们调用socket_shutdown($ s,1); 关闭套接字上的写入.然后读完后我们:

socket_shutdown($s,2); socket_close($s);
Run Code Online (Sandbox Code Playgroud)

所有读取和写入都是在while循环中完成的,循环最多有12个并发连接,如果没有命中,则继续进行并继续向数组添加另一个URL.每个循环调用socket_select,超时为0.

有没有人有什么建议?我想提高速度并减少netstat中出现的TIME_WAIT.

谢谢James Hartig

eat*_*ter 4

您可以将 HTTP 标头Connection: close与您的请求一起发送,这将导致服务器在向您发送请求后发送 TCP FIN。因为对方发送了第一个 FIN,所以在 TIME_WAIT 中等待的将是对方,而不是你。