Я переделал скрипт согласно вашему примеру с SO_REUSEADDR, однако от FIN_WAIT1 избавиться увы не получилось, более того невозможно создать сокет на прослушивание пока висит этот FIN_WAIT1.
Неужто нельзя где-нить таймаут ожидания данных и закрытия соединения уменьшить?
и еще: в вашем примере после строки foreach нужно наверное socket_read($c...) использовать вместо socket_read($client)?
и еще reset($clients) перед циклом чтоб указатель на 0й элемент массива установить после предыдущего перебора.
хм… после socket_read($client, 4096) дальше по коду у меня идет нормальный socket_close($client), но видимо он не успевает закрыть сокет до следующего соединения (судя по мануалу по сокетам в php такое бывает).
понаблюдал за сокетами через netstat — чаще всего зависают в статусе TIME_WAIT, до FIN_WAIT_1 дело доходит когда незакрытых сокетов становится несколько.