У меня возник бы вопрос о параллельных сокетных соединениях в 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
? Или проблема в другом классе? Заранее спасибо за ответы!