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()にそれぞれ変更すれば動作すると思います。

注意点:APCPHP CLIからは実行できない

PHP CLIからはAPCは動かないので、テスト用スクリプトを書いてターミナルで実行してもfalseになるので注意が必要です。

(これで数時間無駄にしました。。。)