「memcached」タグアーカイブ

pecl::memcached はセッションの値を memcached に入れるときに圧縮しない

久しぶりに書いておいた方が良さそう(忘れそう)なのがあったので。

LANの奥の方でひっそりと動いていたPHP 5.3(pecl::memcache)なシステムをPHP 7.4(pecl::memcached)化している途中で「7.4の方だけセッションが切れる」ということがあった。

エラーメッセージはこんなのが出ていた。

PHP Warning: Unknown: error saving session to memcached: SUCCESS in Unknown on line 0, referer: ~
PHP Warning: Unknown: Failed to write session data (memcached). Please verify that the current setting of session.save_path is correct ( ~ ) in Unknown on line 0, referer: ~

最初???という感じだったんだけど、良くコードを眺めるとセッションに大きなオブジェクトを入れている箇所があり、そこでセッションの保存に失敗しているらしいことがわかった。

5.3の方は動くので実際にmemcachedに保存されている値を見るとバイナリっぽいものが保存されていて、このあたりでpecl::memcache はセッションの保存時に透過的圧縮がかかるけど、 pecl::memcached だとかからないのか?という仮説にたどり着いた。

あとは実際に拡張のコードを見ればよいのだけど、セッションの拡張のコードの追い方は
我慢強い人のためのpeclでsession_handlerを作る。を参考に PS_WRITE_FUNC を見れば良いとあたりをつけて、pecl::memcached のコードを見ると圧縮しているところはなさそうだった(ちなみに memcached_set() は libmemcached の関数)。

ということで、セッションに大きなオブジェクトを入れるのをやめるか、memcached(サーバーの方)の設定を変えるかしないとかな..