Как закрыть или reset соединение pconnect() при использовании PHPRedis и PHP-FPM?

Использование PHPRedis и Apache PHP-FPM Я использую вызов pconnect() для повторного использования подключений - его было полезно в прошлом, чтобы не допустить, чтобы количество подключений зависало слишком высоко. Однако в случае, когда наш первичный redis node опускается - мы автоматически продвигаем ведомый к мастеру, а старый мастер становится доступен только для чтения. Однако pconnect() все еще поддерживает соединение со старым maste - поэтому команды set() начинают сбой.

Нам нужен способ снести эти постоянные соединения, не убивая процесс. Любые идеи?

Ответ 1

Стойкие потоки предоставляются внутренними структурами PHP, это неписаный закон, что все, что предоставляет способ создания постоянного потока, должно также обеспечить способ его уничтожения.

PHP Redis нарушает этот закон, вы просто не можете уничтожить этот постоянный поток из userland.

Курс действий должен быть PR для реализации требуемого метода.

Здесь патч против ветки PHP7, которая реализует Redis:: pclose: https://gist.github.com/krakjoe/326eadc61bea38fdd6e6

Обратите внимание, что код для pdisconnect основан на существующем отключении, обе эти функции выглядят странно для меня и не являются честными относительно их возвращаемого значения. Я предполагаю, что есть некоторые тесты или коды, которые полагаются на эту странность, поэтому не пытались ее исправить.

В любом PR следует упомянуть, что эти функции выглядят странно, а PHP7 - идеальное время, чтобы сломать материал.

Ответ 2

Вы вызываете pconnect с таймаутом? Предполагая, что соединение закрывается каждый раз, когда превышен тайм-аут, вы можете повторно разрешить мастер перед повторным вызовом pconnect с другим адресом.

Если вы используете кластер Redis, PHPRedis имеет режим кластера с поведением тайм-аута, специфичным для этой настройки, с поддержкой ответа "MOVED": https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#timeout

Ответ 3

в phpredis 4.3.0 close() может закрыть соединение, созданное pconnect(). если вы используете метод redis после close(), новое постоянное соединение будет создано автоматически.