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 回答