Тайм-аут 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 не закрывают соединение с клиентом, если клиент бездействует в течение многих секунд: соединение останется открытым навсегда».


person Farzher    schedule 06.08.2013    source источник


Ответы (4)


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

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

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

person parhamr    schedule 06.08.2013

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

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

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

person Reetesh Ranjan    schedule 24.02.2014

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

.....

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

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

person zhangzhibin    schedule 28.03.2017

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

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

Итак, я установил timeout=0 в свой redis.conf, и проблема решена!

person lindy    schedule 27.04.2014