Тайм-аут 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