Laravel5.6のセッション管理をmemcachedでやる手順(2)
パート1はこちらからどうぞ。
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', ], ],
自分のMacにmemcachedをインストールして実験するため
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
わーい♫ できたー