Я запускаю рабочий процесс очереди PHP, который обрабатывает задания, которые в свою очередь создают клиентов SOAP и выполняют запросы SOAP. Я постараюсь набросать псевдокод как можно более четко.
Задания и параметры сохраняются в базе данных и создаются работником. В упрощенном виде рабочий выглядит так:
while(true) {
$job = initiateFromDatabase($id);
$job->handle()
}
Для определенной работы создается экземпляр SOAPClient и выполняется вызов SOAP. Некоторые результаты сохраняются в базе данных.
Проблема в том, что процесс довольно скоро достигнет предела количества открытых файловых дескрипторов. После некоторого осмотра с lsof -a -p <worker_pid>
в CLOSE_WAIT висят сотни дескрипторов TCP.
Я провел интенсивные исследования и пришел к выводу, что нет способа явно закрыть сокет-соединение SOAP (и базовый).
Единственный способ очистить сотни дескрипторов CLOSE_WAIT — просто уничтожить рабочий процесс.
Как я могу убедиться, что могу запустить работника в течение более длительных периодов времени и заставить дескрипторы CLOSE_WAIT исчезать после того, как экземпляр SOAPClient больше не используется?
Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …