сокеты — высокая скорость соединения между Php и Redis

У меня есть бэкэнд на php, который работает с Redis.

Но когда запросы увеличились и они превысили 2000 запросов в секунду, я получаю сообщение об ошибке:

99 - Cannot assign requested address

Все сокеты в TIME_WAIT.


Пример подключения:

$this->_socket = @stream_socket_client(
'tcp://' . $this->hostname . ':' . $this->port,
$errorNumber,
$errorDescription,
ini_get('default_socket_timeout'),
STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT
);

Я нахожу решение: http://redis4you.com/articles.php?id=012&имя = Redis

Но / proc / sys / net / ipv4 / tcp_tw_recycle я не могу установить в 1.
Не хочу терять пакеты в сети между приложением и redis.

Php на новый запрос от API создать новый сокет.

Есть идеи?

0

Решение

Я не знаю весь ваш дизайн, но вот что вы могли бы сделать:

  • Создать страницу PHP, которая всегда выполняется (с циклом while (true))
  • Эта страница будет ожидать содержимого с вашей начальной страницы (где ранее был код сокета)
  • Используя метод конвейерной обработки, вы отправляете все запросы с использованием одного и того же сокета.
  • Единственное, чего не хватает, это как передать данные с начальной страницы на эту новую страницу.

В этой последней части я вижу несколько решений (не уверен, что они все работают):

  • Использование APC для хранения данных с начальной страницы и их использование для получения новой страницы.
  • Создайте Сессию на новой странице, которая будет иметь два режима: Обработка, Отправка. Затем вы должны вызвать эту страницу, используя ваш локальный сервер внутри начальной страницы.

В обоих решениях один экземпляр этой новой страницы должен выполняться локально, поэтому активируется «Обработка / Ожидание».

0

Другие решения

Исправлена ​​проблема.
Используйте tcp reuce и время ожидания для наборов сокетов за 10 секунд. PHP работает с сокетом в постоянном режиме

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

Таким образом, даже при 2000 запросах в секунду он использует не более 61 сокета.

0

По вопросам рекламы [email protected]