あざらし備忘録。

音ゲー好きなウェッブエンジニアがいろいろ思った事やった事を書いていくブログです

DoctrineCacheBundleでMemcachedを使おうとした時にハマった話[Symfony2][DoctrineCacheBundle][Memcached]

Symfony2プロダクトでMemcachedを使おうとした時には、DoctrineCacheBundleが使えます。

github.com

基本的にはカジュアルにコンテナから取り出せて便利〜って感じだったのですが、ElastiCacheを使おう〜って思った時にガンハマりしたので備忘録として。

どうハマったか

端的にいうと、「yaml記法で書かれた設定ファイルのホスト名がよしなに書き換えられてしまう」せいで、ElastiCacheにつながらない、という問題に直面して、苦労したお話です。

原因がわからず詰まっていた

どう書き換えられたか

github.com

この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を扱うときは、「ホスト名やポート名は明示するようにしましょう」という備忘録でした。