Estoy trabajando en un sitio que se conecta a muchas URL a la vez, (esperamos llegar a ~ 600 por minuto) y no importa lo que intento, siempre hay miles de TIME_WAIT sigue abierto. Entiendo que estos son vitales para las conexiones TCP, pero están usando todos los puertos disponibles. PHP no tiene un SO_REUSEPORT y SO_REUSEADDR no funciona con conexiones remotas. Aquí está el principio del código:Miles de TIME_WAIT a pesar de SO_LINGER, cierre etc.
$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);
El $ s va en una matriz que contiene toda la escrituras pendientes, después de una escritura que llamamos socket_shutdown ($ s, 1); para cerrar la escritura en el zócalo. Luego, después de una lectura que:
socket_shutdown($s,2); socket_close($s);
Todo lectura y la escritura se hace en un bucle while, el bucle tiene un máximo de 12 conexiones simultáneas, si eso no es alcanzado, entonces se pasa y se procede a añadir otra URL a la matriz. Cada bucle llama a socket_select con un tiempo de espera de 0.
¿Alguien tiene alguna sugerencia? Me gustaría aumentar la velocidad y reducir los TIME_WAIT que aparecen en netstat.
Gracias, James Hartig