Проблема прослушки портов

Vales

Новичок
Приветствую господа !
Будем очень признательны в помощи для разрешения следующей проблемы:

Мы пытаемся наладить скрипт для прослушки портов, предназначенный для
обслуживания GPS-трекеров. Данный скрипт (текст скрипта приведен ниже)
по замыслу должен быть многозадачным. В принципе так и есть, но он работает
корректно при небольшом количестве подключенных трекеров (8-10). Если трекеров
больше, то некоторые входящие процессы (или запросы) начинают зависать и естественно скрипт
перестает принимать другие запросы.

Если посмотреть через консоль, то это выглядит так:

/$ lsof -i:8801
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 2179 root 4u IPv4 48358122 0t0 TCP u15830258.onlinehome-server.com:8801->2.72.173.130:xinupageserver (CLOSE_WAIT)
php 2179 root 5u IPv4 46930255 0t0 TCP u15830258.onlinehome-server.com:8801 (LISTEN)
или так

/$ lsof -i:8801
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 2179 root 4u IPv4 48358122 0t0 TCP u15830258.onlinehome-server.com:8801->2.72.173.130:xinupageserver (ESTABLISHED)
php 2179 root 5u IPv4 46930255 0t0 TCP u15830258.onlinehome-server.com:8801 (LISTEN)
в этой ситуации помогает только kill -9 2179. При этом если скрипт прослушки запущен консольно,
то приходится перезапускать его заново. А если из браузера, то убивается указанный процесс и
скрипт работает дальше, но недолго. И все трекера просто не успевают отбиваться.
В данный момент нам надо обслужить около 100 трекеров.
Будем очень признательны за подсказки, в каком направлении копать.

ЗЫ. Злопыхателей, со словами, "мол, вы чайники-кофейники, мануалы читать надо" просим не растрачивать
попусту слова. Мы итак знаем, что мы "чайники" и мануалы читали. Не помогло :)

собсно сам код скрипта:
PHP:
error_reporting(1);
set_time_limit(0);
ini_set("max_execution_time","0");
ini_set('error_log',"1");
ini_set("memory_limit","9999M");
ignore_user_abort(1);

  ob_implicit_flush();

 require('mylib.php');
/*
  цепляем библиотеки
*/

$day_log =  "/";


 $dl = fopen($day_log."daylog.log", "a+");
 fputs($dl, "\n*************************************\n Server is started\n");

$address = "192.168.0.1";
$port = 8801;

         fputs($dl,"Create socket ...  ");
         if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
             fputs($dl,'socket_create() failed: '.socket_strerror(socket_last_error())."\n");
             fclose($dl);
         } else {  fputs($dl, "OK\n"); }

      fputs($dl,"Socket set option  SO_REUSEADDR ...  ");
      if(!socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1))
        {
          if(is_resource($socket)) socket_close($socket);
             fputs($dl,'socket_set_option() failed: '.socket_strerror(socket_last_error())."\n");
             fclose($dl);
         }
         else {  fputs($dl, "OK\n"); }


        if(!socket_set_nonblock($socket))
        {
          if(is_resource($socket)) socket_close($socket);
        }

      fputs($dl,"Bind socket ...  ");
        if(!socket_bind($socket, $address, $port))
        {
          if(is_resource($socket)) socket_close($socket);
             fputs($dl,'Unable to bind socket: '.socket_strerror(socket_last_error())."\n");
             fclose($dl);
        }
          else {  fputs($dl, "OK\n");  }

      fputs($dl,"Listen socket ...  ");
        if(!socket_listen($socket))
        {
          if(is_resource($socket)) socket_close($socket);
             fputs($dl,'Unable to listen socket: '.socket_strerror(socket_last_error())."\n");
             fclose($dl);
          die(socket_strerror(socket_last_error($socket)));
         }
          else {  fputs($dl, "OK\n");  }

       $abort = false;

		while(!$abort) {

            $clientID = uniqid("client_");
           	$client = socket_accept($socket);

  if (($client) < 0 || $client == FALSE )
       {
          if(is_resource($client)) socket_close($client);
          continue;
        }
    else
       {
            $clients[$clientID]  = new client($client, $clientID);
             if($clients[$clientID]->rs)
               {
                 fputs($dl, $clients[$clientID]->rs->paramID.'( process ID:'.$clientID.") -- OK -- \n");
               }
            unset($clients[$clientID]);
       }

             if(is_resource($client)) socket_close($client);

		  }

          fclose($dl);

    socket_close($socket);



class client {
    var $connection;
    var $buffer = '';
    var $rs = NULL;
    function client($connection, $cid) {

        $this->connection = $connection;
        $input = socket_read($this->connection, 1024);

        if(!$input)  return NULL;

       $protocol = Tcommander::defineType($input);

       switch($protocol)
         {
           case '1':
              $command = Tcommander::redviewInit($input);
              /*
                тут мы распознаем протокол, парсим его и пишем результат в базу
              */
           break;
         } // sw

       $this->disconnect();
       return $this->rs = $command;
      }

    function disconnect() {
        if(is_resource($this->connection))
            socket_close($this->connection);
    }
    function send($str) {
        socket_write($this->connection,$str);
    }
}
 
Сверху