Predis дает "Ошибка при чтении строки с сервера",

Я использую predis и подписывается на канал и слушает, он выдает ошибку и умирает, как показано ниже, через 60 секунд exaxtly, это, конечно, не моя ошибка веб-сервера или его таймаут.

Существует аналогичная проблема, обсуждаемая здесь здесь. Не удалось получить много.

Я попытался установить connection_timeout в файле predis conf на 0, но не очень помогает.

Также, если я продолжаю использовать (отправлять данные на него и обрабатывает), рабочий не дает никакой ошибки. Так что, скорее всего, это время ожидания, и это тоже в связи.

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

$pubsub = $redis->pubSub();
$pubsub->subscribe($channel1);

foreach ($pubsub as $message) { //doing stuff here and unsubscribing from channel
}

Трассировка

PHP Fatal error:  Uncaught exception 'Predis\Network\ConnectionException' with message 'Error while reading line from the server' in Predis/Network/ConnectionBase.php:159 Stack trace:
#0 library/vendor/predis/lib/Predis/Network/StreamConnection.php(195): Predis\Network\ConnectionBase->onConnectionError('Error while rea...')
#1 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(259): Predis\Network\StreamConnection->read()
#2 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(206): Predis\PubSub\PubSubContext->getValue()
#3 pdf/file.php(16): Predis\PubSub\PubSubContext->current()
#4 {main}   thrown in Predis/Network/ConnectionBase.php on line 159

Также проверял тайм-аут redis.conf, его также отключили.

Ответ 1

Просто установите параметр соединения read_write_timeout в 0 или -1, чтобы исправить это. например.

$redis = new Predis\Client('tcp://10.0.0.1:6379'."?read_write_timeout=0");

Настройка параметров подключения задокументирована в README. Автор Redis отметил значимость параметра read_write_timeout этой ошибки в проблеме GitHub, в которой он отмечает, что:

Если вы используете Predis в подобном демонам script, вы должны установить read_write_timeout в -1, если вы хотите полностью отключить таймаут (это значение работает со старыми и более новыми версиями Predis). Также помните, что вы должны отключить тайм-аут Redis по умолчанию, установив timeout = 0 в redis.conf, или Redis отключит подключение незанятых клиентов после 300 секунд бездействия.

Ответ 2

У меня была схожая проблема, лучшим решением ситуации является установка тайм-аута на 0, но с использованием экспоненциального отсрочка и установка верхнего и нижнего пределов. Изменение параметра конфигурации connection_timeout на 0 также решит проблему.