PHP сокеты нескольких клиентов для чтения / записи - PullRequest
0 голосов
/ 29 июня 2018

У меня возник бы вопрос о параллельных сокетных соединениях в PHP. Я не эксперт по сокетам, поэтому задаю этот вопрос здесь. Я создал библиотеку, которая способна сохранять данные (строка / int / float / array / object или все, что можно сериализировать без потерь), например, кеш, в PHP. Я предоставил часть своего кода, которая, как мне кажется, вызывает проблему, но если вам нужна дополнительная информация, посетите: https://github.com/dude920228/php-cache

Концепция была:

  • Создание сервера сокетов TCP
  • Принимать соединения
  • Чтение сериализованного массива PHP из подключающегося клиента
  • Вызвать обработчик действия для действия, полученного от клиента, и выполнить некоторые действия с данными, отправленными при необходимости, или записать обратно клиенту
  • Закрыть соединение на стороне клиента

Он работает как шарм с примерно 25 параллельными соединениями, но по какой-то причине клиенты не получают данные, которые они должны получить. При 100 параллельных соединениях только половина клиентов получает данные. Программа не выдает никаких ошибок, и единственный оператор контроля ошибок, который я использую, - это вызов socket_accept в основном цикле. Основной цикл выглядит так:

public function run()
{
    $this->socket = $this->ioHandler->createServerSocket();
    while ($this->running) {
        $this->maintainer->checkBackup(time(), $this->bucket);
        $this->maintainer->maintainBucket($this->bucket);
        if (($connection = @socket_accept($this->socket))) {
            $clientId = uniqid();
            socket_set_nonblock($connection);
            $this->clients[$clientId] = $connection;
            $read = $this->clients;
            $write = array();
            $except = array();
            socket_select($read, $write, $except, null);
            $dataString = $this->ioHandler->readFromSocket($connection);
            $data = unserialize($dataString);
            ($this->actionHandler)($data, $this->bucket, $this->ioHandler, $connection);
            $this->ioHandler->closeSocket($connection);
            unset($this->clients[$clientId]);
        }
    }
    $this->close();
}

Неужели я там неправильно использую звонок socket_select? Или проблема в другом классе? Заранее спасибо за ответы!

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