DMM.comラボエンジニアブログスマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。読者です読者をやめる読者になる読者になるDMM.comラボエンジニアブログDMM.comラボのエンジニアブログです。DMM.comを支える技術について書いています。2015-11-13phpのapcuはmemchachedみたいに使えなかった話こんにちは、DMMのシステム本部プラットフォーム開発部所属、金沢の高身長エンジニアことリョウタです^^今回はPHPでテストコードを書く際、memchachedの代わりにAPCuを利用して有効期限内のAPIアクセストークンをキャッシュして使い回すつもりが、うまくいかなかった話をお伝えします!判明したことざっくりいうと、phpのcli(コマンドライン)から、APCuはmemchachedっぽく使うことができません!もう少し細かく言うと、キャッシュするようにデータを入れたり、出したりできますが、有効期限(ttl)は意味をなさないし、格納したキャッシュはコマンドラインの実行プロセスが終了すると全部破棄されるのでmemchachedのように使うことはできませんでした。経緯PHPにAPC(現在はAPCu)を入れるとmemchachedみたいにメモリにデータ入れられると聞いたことからです。OpcacheとAPCuに分割されており、ユーザ定義データをキャッシュするにはAPCuが必要です。insideやろうとしたことPHPでテストを行う際に、有効期限内のあるトークンをキャッシュして使いまわそうと思っていました。PHPマニュアルを見る限りできそうです、ひとまず意図通り使えるのかサンプルコードを書いてみました。apc_fetch('hoge');有効期限きれない!!!!!もちろん、ちゃんと理由がありました。APCuでは、どういう風にキャッシュしているかを知ると答えが見えます。有効期限が切れても参照できるわけその答えは、キャッシュが削除されてないからです!!!本家PHPマニュアルには有効期間。秒間だけ格納されます。(次のリクエスト時に)キャッシュから削除されます。)まで値が持続します。ミソは「(次のリクエスト時に)キャッシュから削除されます。次ってなんでしょうか?2回目のapc_fetchはリクエストちゃうんかい...実は違うんですね、リクエスト時なんでphpが再度実行された時、なんですね。ちなみにOpchacheは、その名の通りPHPの内部的なコンパイル結果(オペコード)をメモリにキャッシュして、また同じPHPファイルを内部的にコンパイルする時はAPCのキャッシュを使っているようです。APCuは、メモリに変数を格納しておける機能なので、オペコードは関係ないようです。気になるもう1つ検証を。有効期限を伸ばしPHPを再実行することで、キャッシュから値がとれるか?答えは取れません。APCのキャッシュはCLIだと実行が終わるたびにキャッシュが毎回破棄されちゃうんです!そもそもcliでのAPCuはデフォルトオフ扱いになっているくらいですからね。同士がいないか探してみたところ...私もそう思います、はい。グローバル変数に毛が生えた感じ?atijusts.hatenablog.comAPCのキャッシュはプロセスごとに独立しているのでCLIで使えたところで特に意味はない。スクリプトの実行が終わるたびにキャッシュは破棄されるので性能上の恩恵はない(ハズ)。Labo採用ページツチノコブログ。