読者です 読者をやめる 読者になる 読者になる

uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

PHPのAPCに関するメモ

PHP: APC - Manual

APCとは

Alternative PHP Cache (APC) は、PHP の実行コードをキャッシュする仕組みで、 フリーかつオープンに使用できます。PHP の中間コードのキャッシュ・最適化を行うための、 フリーでオープンかつ堅牢なフレームワークを提供するということを目標としています。

まずAPCにはapc_define_constantsって言う関数があるんです。
PHP: apc_define_constants - Manual

ご存知のとおり、define() は非常に遅いです。 APC を使用する主な利点はスクリプト/アプリケーションのパフォーマンスの改善なので、 大量の定数を定義する手順を合理化するために、この仕組みが提供されています。 しかし、この関数は期待通りの動作をしません。

この関数は上の説明のとおりにdefine()の代わりに使われるんですが、
たまに、apc_define_constantsだけしか呼び出してない人がいるんですね。

しかし、この関数は期待通りの動作をしません。

ちなみに、上の期待通りに動作しないってなんですか?
自分が動作させてる環境では特に問題なく動いてるんですが。


apc_define_constantsってキャッシュする関数なんで、
apc_define_constantsだけしか使ってないと毎回キャッシュするという結構な無駄が発生します。

これをやるとdefine()の回数(300回ぐらい?)によってはapc_define_constantsするほうが遅くなるんだよ!!




これを回避するにはapc_load_constantsを呼んでやればいい。
apc_load_constantsはapc_define_constantsでキャッシュした値を取得することが出来る関数。
PHP: apc_load_constants - Manual

こんな感じで使うのかな。

<?php
if(!apc_load_constants('numbers')){
$constants = array(
    'ONE'   => 1,
    'TWO'   => 2,
    'THREE' => 3,
);
apc_define_constants('numbers', $constants);
}
echo ONE, TWO, THREE;
?>

これを呼び出すと2回目以降はキャッシュが存在するのでif文の中が実行されなくなる。
define()を100回ぐらい呼び出していたコードをapcのコードに置き換えたところ20%ほど高速化できた。




あと、apc_define_constants()はキャッシュの寿命を設定できないのでこのへんは注意が必要かもしれない。
最後に、APCはコマンドラインからだとキャッシュを操作できないのでブラウザからアクセスしてやる必要がありますよ〜。

      • -

2012.06.02追記
FacebookってまだAPC使ってるのかな。 2007年の時点では使ってるみたいだけど今はどうなんだろう。
facebookでのAPCの設定 - おぎろぐはてな


Apc@Facebook
PDFへのリンクが切れてたので代わりにこっち。