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
わーい♫ できたー