DoctrineCacheBundleでMemcachedを使おうとした時にハマった話[Symfony2][DoctrineCacheBundle][Memcached]
Symfony2プロダクトでMemcachedを使おうとした時には、DoctrineCacheBundleが使えます。
基本的にはカジュアルにコンテナから取り出せて便利〜って感じだったのですが、ElastiCacheを使おう〜って思った時にガンハマりしたので備忘録として。
どうハマったか
端的にいうと、「yaml記法で書かれた設定ファイルのホスト名がよしなに書き換えられてしまう」せいで、ElastiCacheにつながらない、という問題に直面して、苦労したお話です。
原因がわからず詰まっていた
DoctrineCacheBundleってElastiCache使えないとかある…?なぜできないぐぬぬ…
— なかにしごう (@gomachan46) 2015, 7月 16
しかもMemcached取り出してresetServerList()してからsetしなおすと普通に動くようになるとかなんなの…
— なかにしごう (@gomachan46) 2015, 7月 16
なんか間違えてるんだろうか...
— なかにしごう (@gomachan46) 2015, 7月 16
(´;ω;`)ウッ…(´;ω;`)ウッ…(´;ω;`)ウッ…(´;ω;`)ウッ…
— なかにしごう (@gomachan46) 2015, 7月 16
どう書き換えられたか
このREADMEの
# app/config/doctrine_cache.yml doctrine_cache: providers: my_memcached_cache: memcached: servers: memcached01.ss: 11211 memcached02.ss: port: 11211
を参考にして、設定ファイルを以下の様に書いていました。
# app/config/doctrine_cache.yml doctrine_cache: providers: my_memcached_cache: memcached: servers: hoge-fuga-01.abcdef.0001.apne1.cache.amazonaws.com: 11211 hoge-fuga-02.abcdef.0001.apne1.cache.amazonaws.com: 11211
的な感じで。
これがなんと、コンテナから取り出した時にはホスト名がそれぞれ
hoge_fuga_01.abcdef.0001.apne1.cache.amazonaws.com hoge_fuga_02.abcdef.0001.apne1.cache.amazonaws.com
に自動的に書き換えられた状態でセットされてしまう、というものでした。 yamlの仕様かYmlParserの仕様かDoctrineCacheBundleの仕様かContainer周りの仕様か追いきれてないですが、とりあえずこうなってしまうようですorz
どう解決したか
READMEのxmlの例を見て推測しつつ、次のようにやってみたら出来ましたw
# app/config/doctrine_cache.yml doctrine_cache: providers: my_memcached_cache: memcached: servers: server1: host: hoge-fuga-01.abcdef.0001.apne1.cache.amazonaws.com port: 11211 server2: host: hoge-fuga-02.abcdef.0001.apne1.cache.amazonaws.com port: 11211
この様にするとホスト名を文字列的に明示してかけるのでよしなに書き換えられる事なく無事つなげることができました。
原因がわかってみれば大したことはなかったのですが、なかなか問題の切り分けがしづらく苦戦しました...
ということで、DoctrineCacheBundleを使ってMemcachedを扱うときは、「ホスト名やポート名は明示するようにしましょう」という備忘録でした。