Использование redis для ветки php 5.2. Я получаю случайную ошибку «Ошибка при чтении строки с сервера». Я использовал команду lpush сериализованной строки.
Я использую predis в скрипте демона php, то есть он работает постоянно. Я уже установил таймаут для redis.conf равным 0.
Вы уже выполнили описанные здесь шаги для устранения проблемы, прежде чем открывать новую проблему с тем же названием? См. Также эту ветку в списке Redis, это также может быть что-то не связанное с проблемами на стороне клиента.
Спасибо nrk. Я попробую установить socket_timeout и read_write_timeout и сообщу о своих выводах здесь позже.
Если вы используете Predis в скрипте, подобном демону, вы должны установить read_write_timeout
равным -1
если вы хотите полностью отключить тайм-аут (это значение работает как со старыми, так и с новыми версиями Predis). Также помните, что вы должны отключить тайм-аут Redis по умолчанию, установив timeout = 0
в redis.conf, иначе Redis
nrk, попробовал, как упоминалось, и теперь работает отлично. Спасибо!
Тем не менее, время от времени остается много тайм-аутов подключения. Я уже установил timeout = 0 и read_write_timeout на -1. Есть ли что-нибудь, что мы можем сделать, чтобы отладить это, когда это произойдет?
timeout
не является параметром подключения, распознаваемым Predis, вместо него следует использовать connection_timeout
. Значение по умолчанию для connection_timeout
составляет 5 секунд, вы можете попытаться поднять его значение, но я не думаю, что это решение вашей проблемы. Вы должны попробовать и посмотреть, что происходит на вашем сервере, когда возникают эти таймауты, это действительно зависит от вашего приложения, поэтому я ничем не могу помочь. Возможные причины тайм-аутов:
KEYS
где-то в своих сценариях? В зависимости от количества хранилищ ключей в Redis, KEYS
может в конечном итоге заблокировать сервер, который тем временем не сможет обрабатывать другие запросы или входящие соединения.Я оставлю этот вопрос пока открытым, но я совершенно уверен, что он определенно не имеет отношения к Predis.
nrk. Как и было рекомендовано, я увеличил connection_timeout до 30. Будем следить за этим.
Еще одно обновление, я измерил соединение, и оказалось, что действительно исключение произошло через 5 секунд. Я попытался изменить connection_timeout с помощью:
новый Predis_Client ($ param, array ('read_write_timeout' => -1, 'connection_timeout' => 30));
Это правильно? Кажется, что это не влияет на 30s connection_timeout и по-прежнему генерирует исключение.
Это параметры подключения, а не параметры клиента, поэтому read_write_timeout
и connection_timeout
должны быть указаны в качестве параметров в $param
.
Честно говоря, Predis не делает ничего особенного с ресурсами сокета при подключении к хосту, поскольку это что-то почти полностью делегировано внутренним компонентам PHP, поэтому это может быть либо ошибка в PHP (маловероятно, но все же возможно), либо некоторая конфигурация / время выполнения. проблема на ваших серверах, или Redis выполняет некоторые тяжелые операции, которые в конечном итоге блокируют сервер на некоторое время.
nrk, еще раз спасибо за ваш ответ. Я обнаружил проблему, и это просто проблема с сервером ip_conntrack. Как только conntrack будет исправлен, истечет время ожидания соединения.
Приятно знать, что вы наконец нашли настоящую проблему, стоящую за этими таймаутами. Я, вероятно, добавлю это где-нибудь в FAQ, чтобы предоставить пользователям начальный список проверок для устранения проблем с тайм-аутом.
Получал ту же ошибку, решенную с помощью установки read_write_timeout как 0.
Я делал это в predis, можем ли мы сделать то же самое с помощью клиента predis?
как показано здесь http://code.google.com/p/dires/source/browse/trunk/predis/examples/PubSubContext.php?r=4
Я делаю предис-клиент, используя: $ redis = new Predis \ Client ("tcp: //". $ TurboConfig-> getActivitiesRedisHost ()); как передать read_write_timeout в моей реализации.
@amitchhajer клиент принимает одни и те же параметры соединения с именованными массивами или строками URI, поэтому, если вы используете строку URI, вы можете просто добавить ее, как если бы это была строка запроса: tcp://127.0.0.1:6379?read_write_timeout=0
.
@nrk спасибо за информацию, сейчас работает неплохо.
Что, если нам нужно изменить read_write_timeout во время выполнения? Существует ли какой-то установщик для параметров тайм-аута (кроме конструктора)?
Параметры соединения
$connection = $client->getConnection();
$stream = $connection->getResource();
stream_set_timeout($stream, 2);
Обратите внимание, что выполнение $connection->getResource()
эффективно запускает операцию connect()
для Redis, поэтому вы можете в конечном итоге потерять преимущества ленивых подключений в зависимости от того, как вы собираетесь использовать эту функцию.
Обратите внимание, что параметр connection_timeout
был переименован в timeout
в новой версии Predis.
Я довольно часто использую « h- ключи». Может ли это привести к блокировкам?
Если вы используете Predis в скрипте, подобном демону, вы должны установить
read_write_timeout
равным-1
если вы хотите полностью отключить тайм-аут (это значение работает как со старыми, так и с новыми версиями Predis). Также помните, что вы должны отключить тайм-аут Redis по умолчанию, установивtimeout = 0
в redis.conf, иначе Redis
Есть ли какие-либо недостатки или предостережения, связанные с установкой тайм-аута = 0 в redis.conf?
Я подозреваю, что связи никогда не пропадут
Использование Redis останется высоким
nrk, еще раз спасибо за ваш ответ. Я обнаружил проблему, и это просто проблема с сервером ip_conntrack. Как только conntrack будет исправлен, истечет время ожидания соединения.
Как исправить этот договор .. где искать?
Есть ли какие-либо недостатки или предостережения, связанные с установкой тайм-аута = 0 в redis.conf?
@ aditya-rewari-cb на самом деле timeout = 0
в redis.conf используется по умолчанию, начиная с Redis 2.4 (выпущенного несколько лет назад), поэтому я бы сказал, что здесь нет недостатков.
Если вы используете Predis в скрипте, подобном демону, вы должны установить
read_write_timeout
равным-1
если вы хотите полностью отключить тайм-аут (это значение работает как со старыми, так и с новыми версиями Predis). Также помните, что вы должны отключить тайм-аут Redis по умолчанию, установивtimeout = 0
в redis.conf, иначе Redis
@nrk Я использую Redis с процессами демона (работники супервизора laravel), а также с регулярным кешированием
Какие-нибудь предостережения при использовании read_write_timeout => -1?
Я хотел подтвердить любую возможность поломки или ошибки ... в моем обычном кешировании Redis из-за этого изменения!
Спасибо !
Самый полезный комментарий
Если вы используете Predis в скрипте, подобном демону, вы должны установить
read_write_timeout
равным-1
если вы хотите полностью отключить тайм-аут (это значение работает как со старыми, так и с новыми версиями Predis). Также помните, что вы должны отключить тайм-аут Redis по умолчанию, установивtimeout = 0
в redis.conf, иначе Redis