Transient APIがW3TCでAPCを有効にすると動作しない件
Transient APIを使ってキャッシュをしようしても正常に動作しない。
環境と事象
環境: PHP 5.4.45 APC 3.1.15dev WordPress 4.3.1 W3 Total Cache 0.9.4.1
具体的な事象としては、
- set_transient()をするとtrue
- get_transient()で保存したキャッシュを取得しようとするとfalse
- W3 Total CacheのObject Cache Method:をDiskにすると正常に動作
といった感じです。
TransientAPIが動作しない原因
WordPressのバージョンを更新した時に発生したので、おそらくW3 Total CacheのオブジェクトキャッシュとWordPress本体のTransient APIが何らかのコンフリクトを起こしているのかと思いました。
これを詳しく調べると泥沼にはまりそう&原因がわかってもWordPressとプラグイン側の問題だとしたらあまり手を出したくないので、今回は以下の解決策で対処しました。
TransientAPIのエラー解決策
1. オブジェクトキャッシュにAPCを使わない
Diskにするとパファーマンスは落ちますが、正常に動作します。
eAcceleratorやmemcachedは試していないので不明です。
2. APCを直接操作する
オブジェクトキャッシュをAPCのユーザーキャッシュにストアするには、なにもTransient APIを使う必要はありません。
APCが有効されているPHPでは、apc_store()やapc_fetch()といった関数でAPCのキャッシュを操作できます。
ぞれぞれ、下記のようにset_transient()など同じように引数をとります。APCを利用する場合は、ほぼ同様に使うことができるのではないでしょうか。
apc_store ( string $key , mixed $var [, int $ttl = 0 ] ) apc_fetch ( mixed $key [, bool &$success ] ) $key:一意なキー $var:保存する値 $ttl:保存期間
なので、set_transient()をapc_store()に、get_transient()をapc_fetch()にそれぞれ変更すれば動作すると思います。
注意点:APCはPHP CLIからは実行できない
PHP CLIからはAPCは動かないので、テスト用スクリプトを書いてターミナルで実行してもfalseになるので注意が必要です。
(これで数時間無駄にしました。。。)