Назад | Перейти на главную страницу

PHP 7.2 не удалось прочитать данные сеанса: memcache

Я перемещаю некоторые серверы с Ubuntu 16 на Ubuntu 18, и у меня возникают проблемы с работой сеансов php и memcache.

В текущей (Ubuntu 16) настройке есть три сеанса обмена серверами с использованием memcache (примечание: не memcached!).

Я считаю, что реплицировал текущую настройку на новые серверы, но это не работает, и я получаю следующую ошибку в журнале ошибок apache:

PHP Warning:  session_start(): Failed to read session data: memcache (path: tcp://10.32.82.6:11211?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://10.32.82.7:11211?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://10.32.82.8:11211?persistent=1&weight=1&timeout=1&retry_interval=15)

В phpinfo() Я вижу что session.save_path и session.save_handler установлены правильно (как показано в сообщении журнала выше).

Если я перейду на любую из трех машин, я смогу подключиться по telnet к порту 11211 на любом из других серверов.

Если я смотрю журналы (установленный на -vv), я вижу, что происходит, и довольно много операторов «NOT_FOUND», но я действительно не знаю, как интерпретировать эти журналы.

В /etc/php/7.2/mods-available/memcache.ini:

memcache.allow_failover="1"
memcache.max_failover_attempts="4"
memcache.session_redundancy="4"

При текущей настройке (Ubuntu 16) я помню, как пробовал использовать memcached и memcache и выяснил, что memcache - правильное решение. Мое последнее средство - попробовать memcached в новой настройке, так как я чувствую, что memcache должен работают, и мне просто чего-то не хватает, или что-то изменилось в Ubuntu 18, о чем я не знаю.

У меня была такая же проблема с PHP 7.1 и memcached, но я думаю, что это также решит вашу проблему.

Проблема связана с функцией чтения, которая возвращает false или null, если сеанс не существует. Вам нужно переопределить эту функцию, чтобы вернуть пустую строку.

Как мне это удалось:

создал класс, который расширил SessionHandler

class MyMemcachedSessionHandler extends SessionHandler {
    public function read($id)
    {
        $data = parent::read($id);
        if(empty($data)) {
            return '';
        } else {
            return $data;
        }
    } 
}

и до session_start () я зарегистрировал его

$myMemcachedSessionHandler = new MyMemcachedSessionHandler();
session_set_save_handler($myMemcachedSessionHandler);

Я надеюсь, это поможет

У меня такая же проблема. У меня есть три сервера, один из которых обновлен до PHP7.2, а остальные временно работают на 7.0. Я отследил проблему до изменения конфигурации между ними для библиотеки memcached. Версия 7.0 имела memcached.sess_prefix установлен в memc.sess.key.. 7.2 имеет memc.sess.. Я исправил это, запустив это раньше session_start() на коробке 7.2:

ini_set('memcached.sess_prefix', 'memc.sess.key.');