Тайм-аут PHP Redis, ошибка чтения при подключении?

"Неустранимая ошибка PHP: необработанное исключение" RedisException "с сообщением" ошибка чтения при подключении ""

Драйвер здесь - phpredis

$redis->blpop('a', 0);

Это всегда истекает через ~1 минуту. Мой redis.conf сообщает тайм-аут 0 и $redis->getOption(Redis::OPT_READ_TIMEOUT) возвращается double(0)

Если я делаю это, он никогда не истекает $redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

Зачем мне -1? Документация Redis говорит timeout 0 в redis.conf никогда не должен выходить из меня.

"По умолчанию последние версии Redis не закрывают соединение с клиентом, если клиент простаивает в течение многих секунд: соединение останется открытым навсегда".

5 ответов

Текущее решение, о котором я знаю, - отключить постоянные соединения для phpredis, так как они были объявлены ошибочными с октября 2011 года. Если вы используете php-fpm или другие многопоточные модели, библиотека специально отключает постоянные соединения.

Уменьшение частоты этой ошибки может быть возможно путем настройки php.ini. default_socket_timeout значение

Кроме того, конфигурации тайм-аута чтения в phpredis не поддерживаются повсеместно. Особенность (ищите OPT_READ_TIMEOUT) был введен в теге 2.2.3.

$redis->connect(host, port, timeout1);

.....

$redis->blpop($key, timeout2);

В котором tiemout1 должен быть длиннее, чем timeout2.

После долгих исследований статей и создания моих собственных файлов redis и php, казалось, что проблема легко решается этим решением. Основная проблема в моем случае использования состояла в том, что сервер Redis не может перенаправить процесс на сохранение записей в памяти в базу данных на диске.

Я оставил все значения тайм-аута в php.ini и redis.conf, как они были, без внесения предложенных хакерских изменений, а затем попробовал только вышеупомянутое решение, и эту проблему "ошибка чтения при подключении", которую невозможно исправить, используя все предложения об изменении Значения таймаута для файлов php и redis conf исчезли.

Я также видел некоторые предложения относительно увеличения лимита на файловые дескрипторы до 100000 и т. Д. Я запускаю свой сценарий использования на облачном сервере с лимитом файловых дескрипторов в 1024, и мой сценарий использования работает даже с этим ограничением.

Я добавляю код ini_set(‘default_socket_timeout’, -1) в моей программе PHP, но я обнаружил, что это не сработало сразу.

Однако через 3 минуты, когда я снова запустил программу php, наконец-то я нашел причину, соединение redis не является постоянным

Тогда я установил timeout=0 в моем redis.conf, задача решена!

Если вы используете PHPRedis, в свой PHP-код добавьте эту строку перед использованием долгосрочной команды redis:

      ini_set('default_socket_timeout', -1);

и изменитьtimeoutв файле конфигурации Redis(/etc/redis.conf):

      timeout 0
Другие вопросы по тегам