web-dev-qa-db-ja.com

PHP 7.2セッションデータの読み取りに失敗しました:memcache

一部のサーバーをUbuntu 16からUbuntu 18に移動していますが、phpセッションとmemcacheを機能させるのに問題があります。

現在の(Ubuntu 16)設定では、memcacheを使用してセッションを共有する3つのサーバーがあります(注: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_が正しく設定されていることがわかります(上記のログメッセージに反映されています)。

3つのマシンのいずれかに移動すると、他のサーバーのポート11211にTelnetで接続できます。

ログ(-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 shouldが機能し、Ubuntu 18で何か気付いていない何かが変更されたように感じるので、私の最後の手段です。

2
Ben Holness

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);

これが役に立てば幸い

4
Aurel Stocheci

同じ問題がありました。私は3つのサーバーを使用していますが、1つをPHP7.2にアップグレードし、他のサーバーを一時的に7.0で実行しています。 memcachedライブラリの2つの間の設定変更まで問題を追跡しました。 7.0バージョンでは_memcached.sess_prefix_が_memc.sess.key._に設定されていました。 7.2には_memc.sess._があります。 7.2ボックスでsession_start()の前にこれを実行して修正しました:

_ini_set('memcached.sess_prefix', 'memc.sess.key.');
_
0
Dave Child