Почему phsockopen возвращает (ресурс временно недоступен)? - PullRequest
2 голосов
/ 29 мая 2009

У меня очень простой серверный php-код, подобный этому

function listenForClients()
 {
      $this->serviceConnection = socket_create(AF_UNIX, SOCK_STREAM, 0);
      socket_bind($this->serviceConnection, "\tmp\mysock", 0);
      socket_listen($this->serviceConnection, 10000000);

      while($clientSocket = socket_accept($this->serviceConnection))
      {
           $clientMessage = socket_read($clientSocket, 1024);
           socket_close($clientSocket);
      }
 }


Тогда у меня есть очень простой клиент, который делает это

for ( $counter = 0; $counter <= 1000; $counter ++) {    
   $fp = fsockopen("unix///tmp/mysock", 0, $errno, $errstr);

   if (!$fp){
      echo  "Error: Could not open socket connection at " . $counter . "\n";
      exit;
   }else{    
      fputs ($fp, "hello", strlen("hello"));
      fclose($fp);
   }
}

По какой-то причине после случайного числа соединений (около 300-500) fsockopen вернется с предупреждением, что Ресурс временно недоступен. В начале я получал предупреждение на 20-30 подключений. Но как только я увеличил параметр backlog в socket_listen, он стал немного лучше, примерно до 300-500. Как мне это преодолеть?

Какой способ построить сокет php-сервера для приема большого количества входящих соединений в секунду (устойчивый).

Спасибо!

Полная ошибка:

Предупреждение PHP: fsockopen (): невозможно подключиться к unix: /// tmp / mysock: 0 (Ресурс временно недоступен) в test.php в строке 22 * ​​1017 *

Ответы [ 2 ]

1 голос
/ 29 мая 2009

Проверьте свой ulimit. Вы переполняете таблицу дескрипторов файлов?

РЕДАКТИРОВАТЬ: значение отставания, которое у вас есть в accept(), является поддельным. Большинство ОС имеют максимальный размер очереди входящих подключений в масштабе десятков, а не тысяч.

0 голосов
/ 13 сентября 2010

Я только что посмотрел на эту проблему (получил через Google), и я нашел, что решение, чтобы избавиться от ошибки:

PHP Warning: fsockopen(): unable to connect to unix:///tmp/mysock:0 (Resource temporarily unavailable) in test.php on line 22

.. не должен использовать fsockopen () в потоке писателя; попробуйте что-то вроде этого:

if (! ($cSock = socket_create(AF_UNIX, SOCK_STREAM, 0))) {
    exit("Failed to create socket");
    continue;
} else if (! socket_connect($cSock, IPC_SOCK)) {
    exit("Failed to connect socket");
} else {
    $bw = socket_write($cSock, $msg);
    if ($bw === false) {
        exit("Socket write failed, %s", array(socket_strerror(socket_last_error())));
    } else {
        exit("Wrote $bw bytes to socket");
    }
}
socket_shutdown($cSock);
socket_close($cSock);

Лучше поздно, чем никогда? ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...