1

のアドオンをExpressionEngine 2.x作成していて、サーバーにデータをキャッシュしたいと考えています。具体的には、テンプレートの解析結果をキャッシュして、同じリクエストに対して再度解析する必要がないようにしたいと考えています。

現時点では を使用し$_SESSIONていますが、それはそのユーザーに対してのみキャッシュされます。理想的には、全員のキャッシュをメモリまたはディスクに保存したいと考えています。私も試しまし$this->EE->session->cacheたが、それは現在のリクエストに対してのみキャッシュします。CodeIgnitor のキャッシング ドライバーを見てきましたが、ExpressionEngine のアドオン内からどのように機能させることができるかわかりません: http://codeigniter.com/user_guide/libraries/caching.html

ファイルを使用しMemcacheたり、ファイルに書き込んだりすることもできますが、さまざまなセットアップで動作する必要があるため、Memcache がインストールされるか、書き込み可能なフォルダーが存在するという保証はありません。

何か案は?

4

2 に答える 2

2

私はかつてCIキャッシングメカニズムの一部を書き直しました。多分これはあなたの助けになるかもしれません。これは「キャッシュ」すべての関数です。システムファイルのオーバーライドとして作成しました。

その中に使用例があります。とてもシンプルなはずです。このコードを使用すると、セッション/リクエスト間で共有することもでき、関数の結果をキャッシュできます。

http://codeigniter.com/forums/viewthread/221313/

またはこれ:

https://github.com/EllisLab/CodeIgniter/issues/1646

この新機能が必要ない場合は、標準のCIキャッシングメカニズムの使用方法の例として使用できます。

このような:

class your_class extends CI_Model
{
    // ------------------------------------------------------------------------

    function __construct( )
    {
        $cache_adapter = 'apc';
        $this->load->driver( 'cache', array( 'adapter' => $cache_adapter, 'backup' => 'dummy' ) );
        $this->cache->{$cache_adapter}->is_supported( );
    }

    // ------------------------------------------------------------------------

    public function your_function( $arg )
    {
        $result = $this->cache->get( __CLASS__ . __METHOD__ . serialize( $arg ) );

        if ( empty( $result ) )
        {
            $result = ... /* your calculation here */

            $this->cache->save( __CLASS__ . __METHOD__  . serialize( $arg ) );
        }
        return $result;
    }
}

キャッシュに使用するキーは、いわゆるマングル関数名です。関数の結果が(そうあるべきであるように)その引数のみに依存している場合は、そのまま使用できます。キーをコンパクトにするために、ハッシュすることができます。このような:

    public function your_function( $arg )
    {
        $result = $this->cache->get( md5( __CLASS__ . __METHOD__ . serialize( $arg ) ) );

        if ( empty( $result ) )
        {
            $result = ... /* your calculation here */

            $this->cache->save( md5( __CLASS__ . __METHOD__  . serialize( $arg ) ) );
        }
        return $result;
    }
于 2012-08-06T20:54:02.703 に答える
1

最も簡単な方法:アドオンのユーザーに、EEのネイティブタグキャッシュを使用してパフォーマンスを向上させるように指示します。タグキャッシングは、ユーザーに関係なく、EEタグごとに機能します。

または、インストール時にデータベーステーブルを作成して、キャッシュされたデータを保持し、それを使用することもできます。キャッシュするデータの量と種類に応じて、パフォーマンスが向上する場合と得られない場合があります。

于 2012-08-07T01:36:40.277 に答える