お久しぶりです、amo-kです! 先日、若手インフラエンジニアにPHPでSessionストレージにmemcachedを使った場合 接続はデフォルトではpersistentなのかそうで無いのかを聞かれました。 最近ほとんどコード書けてないのですが、コードを読む機会ができましたw 彼には、そのWebアプリで利用している拡張モジュールのソースコードを読むのが一番早いよと言って僕はMTGに行ってしまったのですが、さすがに愛想無しだと思ったのと、久しぶりにコードと戯れようと思い、自分で見てみる事にしました。 さて、ということで以下にレポートします! そのWebアプリではPECL::memcache 2.2.1を利用しているようでした。 まずはソースコードの入手ですね。
$ wget http://pecl.php.net/get/memcache-2.2.1.tgz
$ tar xvzf memcache-2.2.1.tgz
$ cd memcache-2.2.1
ぉっと、memcache_session.c コイツぽいぞ〜 はいはい、ありましたありました!!
PS_OPEN_FUNC(memcache)
{
...
        if (i < j) {
            int persistent = 0, weight = 1, timeout = MMC_DEFAULT_TIMEOUT, retry_interval = MMC_DEFAULT_RETRY;

...
                if (zend_hash_find(Z_ARRVAL_P(params), "persistent", sizeof("persistent"), (void **) ¶m) != FAILURE) {
                    convert_to_boolean_ex(param);
                    persistent = Z_BVAL_PP(param);
                }
...
}
一旦 0 で初期化して、指定されていれば代入という事ですね。 つまりデフォルトではpersistentでないということですね。 めでたしめでたしw 便利ツール(OSSのフレームワークや各種ツール)を使っていて問題が起こった時や不明点があった際に皆さんどうしますか? Google検索して解決しなければ諦めるとか言わないで下さいね!! 特にOSSの場合はソースコードを取得出来ますのでWebに情報が無くとも、一番正確な情報(ソースコード)を確認すれば解決できるハズです! KLab若手エンジニアは日々新たな技術と戯れる一方で、しっかりと技術の本質も追求しております。 便利ツールがたくさんあってWebにたくさん情報がある中、我々は「Google検索やツール使いの達人」に成り下がらず、技術者として発信/成長して行きますのでよろしくお願いします!!