Вы что-то не то делаете с сокетами.
FIN_WAIT_1 говорит о том, что ваш сервер соединение закрыл со своей стороны и ждет закрытия со стороны клиента. Имхо, происходит такое потому, что, сделав socket_read(), вы делаете socket_accept() следующему соединению, переменная $client (предыдущий сокет) попадает в сборщик мусора, который пытается корректно завершить соединение. Нельзя так выбрасывать заакцепченный сокет, надо продолжать пытаться читать из него данные, одновременно проверяя, нет ли новых запросов на соединение. Можно организовать это и через sleep'ы, но классический подход состоит в использовании
socket_select(). Следуя вашему подходу, можно написать что-то в этом духе:
while(1) {
usleep(100000);
if((time()-$time) >= 60) { $time = time(); UpdatePID($pid); }
$client = @socket_accept($socket);
if($client) {
$clients[] = $client;
}
foreach($clients as $i => $c) {
$data = socket_read($client, 4096);
if ($data === false) { // error or closed connection
socket_close($c);
unset($clients[$i]);
} elseif (strlen($data)) {
Save2DB(trim($data));
}
}
...