Ticket #3186 (closed defect: fixed)

Opened 1 year ago

Last modified 10 months ago

キャッシュがヒットした直後のpne_cache_recursive_callがキャッシュを利用しない

Reported by: tsukamoto Assigned to: kiwa
Priority: minor Milestone: OpenPNE2.12.8
Component: 指定しない Version: 2.12.x & 2.14.x
Keywords: OpenPNE2.13.6 Cc:

Description (Last modified by kudo)

キャッシュがヒットした直後の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をご確認ください。 上記方針で機械的に修正しました。動作確認は、適した環境がなくできておりません。

■関連情報

Attachments

openpne_2.12.6_diff.tar.gz (2.7 kB) - added by tsukamoto on 12/04/08 23:23:56.
Diff for 2.12.6 (trunk) and test sctripts.

Change History

12/04/08 23:23:56 changed by tsukamoto

  • attachment openpne_2.12.6_diff.tar.gz added.

Diff for 2.12.6 (trunk) and test sctripts.

12/09/08 13:34:58 changed by kiwa

  • keywords deleted.
  • milestone set to OpenPNE2.13.6.

是非取り込みたいので、Milestoneを次の開発版にしてみました。

01/29/09 12:08:57 changed by ebihara

  • keywords set to OpenPNE2.13.6.
  • version set to 2.12.x & 2.13.x.
  • type changed from enhancement to defect.
  • milestone changed from OpenPNE2.13.6 to OpenPNE2.12.8.

安定版についても修正の必要があります。

02/03/09 20:19:13 changed by ebihara

  • owner changed from nobody to ebihara.
  • status changed from new to assigned.

02/10/09 16:27:52 changed by ebihara

  • owner changed from ebihara to nobody.
  • status changed from assigned to new.

コード的には問題ないように見えますが、検証自体はどなたかにお願いしたいです。

02/12/09 14:36:00 changed by kiwa

  • owner changed from nobody to kiwa.
  • status changed from new to assigned.

取り込みます

02/12/09 14:52:55 changed by kiwa

  • keywords changed from OpenPNE2.13.6 to OpenPNE2.13.6 確認中.

以下のリビジョンで取り込みました。

02/12/09 15:17:27 changed by kiwa

  • description changed.

descriptionの見出しをちょっと見やすくしました。

02/13/09 11:02:42 changed by ogawa

  • keywords changed from OpenPNE2.13.6 確認中 to OpenPNE2.13.6 差し戻し.
$is_recurred = false;

の部分で行末に不要なスペースがあるので削除してください。

02/16/09 11:03:11 changed by kiwa

  • keywords changed from OpenPNE2.13.6 差し戻し to OpenPNE2.13.6 確認中.

以下のリビジョンで行末の不要なスペースを削除しました。ご確認ください。

02/17/09 11:10:47 changed by kawahara

  • keywords changed from OpenPNE2.13.6 確認中 to OpenPNE2.13.6 テスト待ち.

02/17/09 18:14:50 changed by kiwa

  • status changed from assigned to closed.
  • resolution set to fixed.

正常動作に問題はないので、完了とします。

02/17/09 18:14:58 changed by kiwa

  • keywords changed from OpenPNE2.13.6 テスト待ち to OpenPNE2.13.6.

05/25/09 13:19:30 changed by kudo

  • description changed.