Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在表达式引擎插件中缓存_Php_Performance_Codeigniter_Caching_Expressionengine - Fatal编程技术网

Php 在表达式引擎插件中缓存

Php 在表达式引擎插件中缓存,php,performance,codeigniter,caching,expressionengine,Php,Performance,Codeigniter,Caching,Expressionengine,我正在为ExpressionEngine 2.x构建一个附加组件,我想在服务器上缓存一些数据。具体来说,我希望缓存解析模板的结果,这样就不必为同一个请求再次解析模板 目前我使用的是$\u SESSION,但这只会缓存该用户。理想情况下,我希望将每个人的缓存存储在内存或磁盘上。我还尝试了$this->EE->session->cache,但它只缓存当前请求。我已经看过CodeIgnitor的缓存驱动程序,但我不确定如何在ExpressionEngine的加载项中使其工作: 我也可以使用Memcac

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

目前我使用的是
$\u SESSION
,但这只会缓存该用户。理想情况下,我希望将每个人的缓存存储在内存或磁盘上。我还尝试了
$this->EE->session->cache
,但它只缓存当前请求。我已经看过CodeIgnitor的缓存驱动程序,但我不确定如何在ExpressionEngine的加载项中使其工作:

我也可以使用
Memcache
或写入文件,但由于它需要在许多不同的设置上工作,因此不能保证会安装Memcache或有任何可写文件夹


有什么想法吗?

我曾经重写过CI缓存机制的一部分。也许这对你有帮助。它是一个“缓存”所有功能。我把它写为对系统文件的重写

其中有一个用法示例。应该很简单。使用此代码,您可以缓存任何函数结果,甚至在会话/请求之间共享

或者这个:

如果不需要此新功能,可以将其用作如何使用标准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;
    }
我用于缓存的键是所谓的mangled函数名。如果函数的结果完全依赖于它的参数(它应该如此),则可以按原样使用它。为了密钥的紧凑性,可以对其进行哈希运算。像这样:

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;
    }

最简单的方法:指示外接程序的用户使用EE的本机标记缓存来提高性能。标记缓存在每个EE标记上工作,而不考虑用户


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

谢谢,这是一些有用的代码。但是,如果要将第三方文件夹作为加载项分发,则无法修改该文件夹之外的任何内容。同意。只需使用标准的EE缓存即可。有关如何使用.Cheers的示例,请参见我的代码。我想我现在会使用PHP的apc缓存,因为这似乎是普遍启用的。不幸的是,我找不到从EE调用CodeIgnitor的$this->load->driver函数的方法,但是代码为我指明了正确的方向。我编辑了我的解决方案,以包含一个关于如何使用CI缓存的通用示例。现在请投我一票;)啊,对了。感谢您的帮助。本机标记缓存是一个很好的解决方案,但只有当它是一个模块或插件,而不是fieldtype或extension时才是如此。这很好,但我想选择何时使用缓存,因为内容将根据url发生变化,即使它确实使用缓存,我也想做一些事情。缓存在数据库中是一个好主意,但是,我可能会看到.CE缓存()使用配置设置来允许开发人员根据服务器上安装的内容来选择它们使用的缓存设置-也许会考虑这种方法……所以,为Memcache构建它,如果没有检测到或选择它,则返回到文件或数据库,或者不进行缓存。