【发布时间】:2011-01-08 00:48:05
【问题描述】:
我正在开发一个同时连接到多个 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。
谢谢, 詹姆斯·哈蒂格
【问题讨论】: