nanisore oishisou

Webエンジニアあるまさんのゆるふわ奮闘記。

Laravel5.6のセッション管理をmemcachedでやる手順(2)

パート1はこちらからどうぞ。

arm4.hatenablog.com

Laravelのsessionドライバーをmemcachedにしようと思ったわけだが
あんなにいつも親切なLaravelのドキュメントに、
なんと、設定方法が載っていなかった。

なので、Laravelのフレームワークのコードを読んで設定したぜよ

というお話。

Laravel 5.6 のsessionドライバーでmemcachedを使う(Macローカルで実験)

.envをのSESSION_DRIVERを書き換える。

.env

SESSION_DRIVER=memcached

vendor/laravel/framework/src/Illuminate/Session/SessionManager.php これによると、cacheドライバーとセッションドライバーの設定は共通らしい。

sessionのconfigのstoreにcacheのstoreのキーを指定すればよいっぽい。

    /**
     * Create an instance of the Memcached session driver.
     *
     * @return \Illuminate\Session\Store
     */
    protected function createMemcachedDriver()
    {
        return $this->createCacheBased('memcached');
    }
    /**
     * Create an instance of a cache driven driver.
     *
     * @param  string  $driver
     * @return \Illuminate\Session\Store
     */
    protected function createCacheBased($driver)
    {
        return $this->buildSession($this->createCacheHandler($driver));
    }
    /**
     * Create the cache based session handler instance.
     *
     * @param  string  $driver
     * @return \Illuminate\Session\CacheBasedSessionHandler
     */
    protected function createCacheHandler($driver)
    {
        $store = $this->app['config']->get('session.store') ?: $driver;

        return new CacheBasedSessionHandler(
            clone $this->app['cache']->store($store),
            $this->app['config']['session.lifetime']
        );
    }

config/session.php

    /*
    |--------------------------------------------------------------------------
    | Session Cache Store
    |--------------------------------------------------------------------------
    |
    | When using the "apc" or "memcached" session drivers, you may specify a
    | cache store that should be used for these sessions. This value must
    | correspond with one of the application's configured cache stores.
    |
    */

    'store' => 'memcached',

config/cache.php

    /*
    |--------------------------------------------------------------------------
    | Cache Stores
    |--------------------------------------------------------------------------
    |
    | Here you may define all of the cache "stores" for your application as
    | well as their drivers. You may even define multiple stores for the
    | same cache driver to group types of items stored in your caches.
    |
    */

    'stores' => [

        'apc' => [
            'driver' => 'apc',
        ],

        'array' => [
            'driver' => 'array',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'cache',
            'connection' => null,
        ],

        'file' => [
            'driver' => 'file',
            'path' => storage_path('framework/cache/data'),
        ],

        'memcached' => [
            'driver' => 'memcached',
            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
            'sasl' => [
                env('MEMCACHED_USERNAME'),
                env('MEMCACHED_PASSWORD'),
            ],
            'options' => [
                // Memcached::OPT_CONNECT_TIMEOUT  => 2000,
            ],
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 100,
                ],
            ],
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],

    ],

自分のMacmemcachedをインストールして実験するため
localhostなので設定はこのままで大丈夫そうだ。

しかしリロードするとMemcachedはないと怒られた。

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
Class 'Memcached' not found

https://laravel.com/docs/5.6/cache#memcached-cache

cacheのほうのドキュメントを読んでみると、Memcached PECL package をインストールしなさいよと書いてある。

pecl install memcached

peclでインストールしてみたがエラーが出た。

ERROR: `/private/tmp/pear/temp/memcached/configure --with-php-config=/usr/local/opt/php/bin/php-config --with-libmemcached-dir=no' failed

libmemcachedのインストールでコケているっぽいのでbrewインストールする。

brew install libmemcached

再度、実行したらインストールに成功。

zlibでエラー出る人はXcodeのアップデートか、再インストールが必要そう。

pecl install memcached
.
.
Build process completed successfully
Installing '/usr/local/Cellar/php/7.2.6/pecl/20170718/memcached.so'
install ok: channel://pecl.php.net/memcached-3.0.4
Extension memcached enabled in php.ini

ちゃんと入っているので、phpをリスタートする。

php -i | grep memcached
memcached
memcached support => enabled
libmemcached version => 1.0.18
sudo brew services stop php
sudo brew services start php

保存されているかテストする

routes/web.php

Route::get('/', function () {
    session()->put('sample', 'beruko');

    return view('welcome');
});

ここでデバッグするためにddとか書いてしまうとsessionが保存されないので、デバッグしたい気持ちをぐっとこらえる。

telnetに接続しmemcachedに保存されているか確認する

stats items
STAT items:8:number 1
stats cachedump 8 1
ITEM beruko_sandbox_cache:uWTlfeZtpTUpHFAYfNR6nwycgA53gO0uZ1xg5nkp [273 b; 1529063998 s]
END
get beruko_sandbox_cache:uWTlfeZtpTUpHFAYfNR6nwycgA53gO0uZ1xg5nkp
VALUE beruko_sandbox_cache:uWTlfeZtpTUpHFAYfNR6nwycgA53gO0uZ1xg5nkp 0 273
a:5:{s:50:"login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d";i:2;s:9:"_previous";a:1:{s:3:"url";s:26:"http://beruko-sandbox.test";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}s:6:"_token";s:40:"BVVBUIbJE94ZCLpb71aTLtSQzNI15r7MUIGwLdjj";s:6:"sample";s:6:"beruko";}
END

わーい♫ できたー