キャッシュがヒットした直後のpne_cache_recursive_callがキャッシュを利用していなさそうです。
下記の日記でいくつか試行しました。
http://sns.openpne.jp/?m=pc&a=page_fh_diary&target_c_diary_id=19811
■現象
pne_cache_recursive_callを各所での呼び出し方法に倣って呼び出すと、キャッシュがあるにもかかわらず、新しい計算値を返すことがあります。
添付tar.gzファイル内の、test_cache_incollect.phpでご確認ください。public_htmlディレクトリに置き、以下で実行できます。
$ php test_cache_incollect.php
date('c')の結果をpne_cache_recursive_callを使用して返すだけのスクリプトですが、以下のようにキャッシュされた値を返したり、現在時刻を返したりが混在します。
$ php test_cache_incollect.php
bool(false)
bool(true)
2008-12-04T21:23:53+09:00
bool(false)
bool(true)
2008-12-04T21:23:53+09:00
bool(true)
2008-12-04T21:23:55+09:00
bool(false)
bool(true)
2008-12-04T21:23:53+09:00
bool(true)
2008-12-04T21:23:57+09:00
bool(false)
bool(true)
2008-12-04T21:23:58+09:00
bool(false)
bool(true)
2008-12-04T21:23:58+09:00
bool(true)
2008-12-04T21:24:00+09:00
bool(false)
bool(true)
2008-12-04T21:23:58+09:00
bool(true)
2008-12-04T21:24:02+09:00
■原因
呼び出し部分のスクリプト(2.12.6で20カ所強ありますが、すべて同様です)で、$is_recurredをfalseに戻す位置が良くなさそうです。
以下の位置で行われていますが、キャッシュがヒットした時、pne_cache_recursive_callは実際には関数の再帰呼び出しをしないので、ここまで処理が来なそうです。
static $is_recurred = false; //再帰処理中かどうかの判定フラグ
if (!$is_recurred) { //function cacheのために再帰処理を行う
$is_recurred = true;
$funcargs = func_get_args();
return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_LONG, __FUNCTION__, $funcargs);
}
$is_recurred = false; // cacheがヒットした時はこの処理に来ない
以下のように、pne_cache_recursive_callを読んだ後、ifブロックからreturnする前で$is_recurredをfalseにした方が良さそうです。
static $is_recurred = false; //再帰処理中かどうかの判定フラグ
if (!$is_recurred) { //function cacheのために再帰処理を行う
$is_recurred = true;
$funcargs = func_get_args();
//cacheにヒットしても処理されるよう、ifブロック内でのreturn直前に$is_recurredをクリア
$result = pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_LONG, __FUNCTION__, $funcargs);
$is_recurred = false;
return $result;
}
添付tar.gzファイル内の、test_cache_collect.phpでご確認ください。public_htmlディレクトリに置き、以下で実行できます。
$ php test_cache_collect.php
■修正内容
添付tar.gzファイル内の、OpenPNE2.12.6用のパッチopenpne_2.12.6_diff.txtをご確認ください。
上記方針で機械的に修正しました。動作確認は、適した環境がなくできておりません。
■関連情報