【问题标题】:Caching in an Expression engine addon在表达式引擎插件中缓存
【发布时间】:2012-08-06 20:08:04
【问题描述】:

我正在为ExpressionEngine 2.x 构建一个附加组件,我想在服务器上缓存一些数据。具体来说,我想缓存解析模板的结果,这样我就不必为同一个请求再次解析它。

目前我正在使用$_SESSION,但这只会为该用户缓存。理想情况下,我想将每个人的缓存存储在内存或磁盘上。我也试过$this->EE->session->cache,但这只缓存当前请求。我已经查看了 CodeIgnitor 的缓存驱动程序,但我不确定如何在我的 ExpressionEngine 插件中让它工作:http://codeigniter.com/user_guide/libraries/caching.html

我也可以使用Memcache 或写入文件,但由于它需要处理许多不同的设置,因此无法保证会安装 Memcache 或会有任何可写文件夹。

有什么想法吗?

【问题讨论】:

  • CE Cache (causingeffect.com/software/expressionengine/ce-cache) 使用配置设置允许开发人员根据服务器上安装的内容来选择他们使用的缓存设置 - 也许考虑这种方法......?所以为 Memcache 构建它,如果没有检测到或选择它,则回退到文件或数据库或不缓存。

标签: php performance codeigniter caching expressionengine


【解决方案1】:

我曾经重写了部分 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;
    }

【讨论】:

  • 谢谢,这是一些有用的代码。但是,如果我要将其作为插件分发,则无法修改 third_party 文件夹之外的任何内容。
  • 同意。只需使用标准的 EE 缓存。有关如何使用的示例,请参阅我的代码。
  • 干杯。我想我现在会使用 PHP 的 apc 缓存,因为这似乎是通常启用的。不幸的是,我找不到从 EE 调用 CodeIgnitor 的 $this->load->driver 函数的方法,但是该代码为我指明了正确的方向。
  • 我编辑了我的解决方案以包含一个关于如何使用 CI 缓存的通用示例。现在请给我你的投票;)
  • 啊,明白了。感谢您的帮助。
【解决方案2】:

最简单的方法:指导插件的用户使用 EE 的原生标签缓存来提高性能。标签缓存适用于每个 EE 标签,与用户无关。

或者,您可以在安装时创建一个数据库表来保存您的缓存数据并使用它。根据您缓存的数据量和类型,它可能会也可能不会产生性能提升。

【讨论】:

  • 原生标签缓存是一个很好的解决方案,但前提是它是一个模块或插件,而不是字段类型或扩展。
  • 那太好了,但我想选择何时使用缓存,因为内容会根据 url 发生变化,即使它确实使用缓存,我也想做一些事情.不过,在数据库中缓存是个好主意,我可能会考虑一下。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2012-01-02
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多