Я работаю над сайтом, который подключается ко многим 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.
У кого-нибудь есть предложения? Я хотел бы увеличить скорость, а также уменьшить значения TIME_WAIT, которые появляются в netstat.
Спасибо,
Джеймс Хартиг