Estoy ejecutando un proceso de trabajador de cola de PHP que procesa trabajos que a su vez crean clientes SOAP y realizan solicitudes SOAP. Intentaré delinear el pseudocódigo lo más claramente posible.
Los trabajos y los parámetros se guardan en la base de datos y el trabajador los instancia. En forma simplificada, el trabajador se ve así:
while(true) { $job = initiateFromDatabase($id); $job->handle() }Para un determinado trabajo, se crea una instancia de SOAPClient y se realiza una llamada SOAP. Algunos resultados se guardan en una base de datos.
El problema es que el proceso alcanzará muy pronto el límite del descriptor de archivo abierto. Después de una inspección con lsof -a -p <worker_pid> , hay cientos de descriptores de TCP colgados en CLOSE_WAIT.
He realizado una investigación intensiva y mi conclusión es que no hay forma de cerrar explícitamente el zócalo de conexión SOAP (y subyacente).
La única forma de borrar los cientos de descriptores CLOSE_WAIT es eliminar el proceso de trabajo.
¿Cómo puedo asegurarme de que puedo ejecutar el trabajador durante períodos de tiempo más largos y hacer que los descriptores CLOSE_WAIT desaparezcan después de que la instancia de SOAPClient ya no se use?
Gracias por adelantado.
Resolví el problema configurando la opción keep_alive en false
$client = new SoapClient($wsdl_url, array('keep_alive'=>false));