Я перемещаю некоторые серверы с 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.');