2011-尊龙官方平台

2011-1-4-----核心模型---mage_core_model_cache---construct方法--个人分析

el/2024/3/25 14:58:51

 

//construct.initialize内存实例   base on $options

 /**

     * class constructor. initialize cache instance based on options

     *

     * @param array $options

     */

    public function __construct(array $options = array())

    {

        $this->_defaultbackendoptions['cache_dir'] = mage::getbasedir('cache');

        /**

         * initialize id prefix

         */

 

        $this->_idprefix = isset($options['id_prefix']) ? $options['id_prefix'] : '';

 

 

        if (!$this->_idprefix && isset($options['prefix'])) {

            $this->_idprefix = $options['prefix'];

        }

        if (empty($this->_idprefix)) {

            $this->_idprefix = substr(md5(mage::getconfig()->getoptions()->getetcdir()), 0, 3).'_';

        }

 

        $backend    = $this->_getbackendoptions($options);

        $frontend   = $this->_getfrontendoptions($options);

 

        $this->_frontend = zend_cache::factory('varien_cache_core', $backend['type'], $frontend, $backend['options'],

            true, true, true

        );

 

        if (isset($options['request_processors'])) {

            $this->_requestprocessors = $options['request_processors'];

        }

    }

 

 

1

$this->_defaultbackendoptions['cache_dir'] = mage::getbasedir('cache');

为cache对象属性:_defaultbackendoptions['cache_dir']赋值为var/cache/.

 

 

 

2

//为$this->idprefix赋值:

取决于$options里面的变量,如:id_prefix,prefix,顺序为:$options['id_prefix']存在,则$this->idprefix = $options['id_prefix'].如果$options['prefix']存在,则$this->idprefix = $options[id_prefix],

如果都不存在,下面有介绍。。。。

 $this->_idprefix = isset($options['id_prefix']) ? $options['id_prefix'] : '';

 

 

        if (!$this->_idprefix && isset($options['prefix'])) {

            $this->_idprefix = $options['prefix'];

        }

        if (empty($this->_idprefix)) {

            $this->_idprefix = substr(md5(mage::getconfig()->getoptions()->getetcdir()), 0, 3).'_';

        }

 

 

3

 $backend    = $this->_getbackendoptions($options);

 

 

//该函数的参数:$cacheoptions,即为construct中的$options参数。

 protected function _getbackendoptions(array $cacheoptions)

    {

        $enable2levels = false;

//1

        $type   = isset($cacheoptions['backend']) ? $cacheoptions['backend'] : $this->_defaultbackend;

//2

        if (isset($cacheoptions['backend_options']) && is_array($cacheoptions['backend_options'])) {

            $options = $cacheoptions['backend_options'];

        } else {

            $options = array();

        }

//

        $backendtype = false;

//3

        switch (strtolower($type)) {

            case 'sqlite':

 

                if (extension_loaded('sqlite') && isset($options['cache_db_complete_path'])) {

                    $backendtype = 'sqlite';

                }

                break;

//4

            case 'memcached':

 

                if (extension_loaded('memcache')) {

                    if (isset($cacheoptions['memcached'])) {

                        $options = $cacheoptions['memcached'];

                    }

                    $enable2levels = true;

                    $backendtype = 'memcached';

                }

                break;

            case 'apc':

//5

                if (extension_loaded('apc') && ini_get('apc.enabled')) {

                    $enable2levels = true;

                    $backendtype = 'apc';

                }

                break;

//6

            case 'xcache':

                if (extension_loaded('xcache')) {

                    $enable2levels = true;

                    $backendtype = 'xcache';

                }

                break;

            case 'eaccelerator':

//7

            case 'varien_cache_backend_eaccelerator':

                if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) {

                    $enable2levels = true;

                    $backendtype = 'varien_cache_backend_eaccelerator';

                }

                break;

//8

            case 'database':

                $backendtype = 'varien_cache_backend_database';

                $options = $this->getdbadapteroptions();

                break;

//9

            default:

                if ($type != $this->_defaultbackend) {

                    try {

                        if (class_exists($type, true)) {

                            $implements = class_implements($type, true);

                            if (in_array('zend_cache_backend_interface', $implements)) {

                                $backendtype = $type;

                            }

 

                        }

                    } catch (exception $e) {

                    }

                }

        }

//10

        if (!$backendtype) {

            $backendtype = $this->_defaultbackend;

            foreach ($this->_defaultbackendoptions as $option => $value) {

                if (!array_key_exists($option, $options)) {

                    $options[$option] = $value;

                }

            }

        }

//11

        $backendoptions = array('type' => $backendtype, 'options' => $options);

        if ($enable2levels) {

            $backendoptions = $this->_gettwolevelsbackendoptions($backendoptions, $cacheoptions);

        }

        return $backendoptions;

    }

 

3.1

$type   = isset($cacheoptions['backend']) ? $cacheoptions['backend'] : $this->_defaultbackend;

 

如果存在$cacheoptions['backend'],则$type等于$cacheoptions['backend'],如果不存在,则$type等于$this->_defaultbackend;

 

 

3.2

 if (isset($cacheoptions['backend_options']) && is_array($cacheoptions['backend_options'])) {

            $options = $cacheoptions['backend_options'];

        } else {

            $options = array();

        }

如果$cacheoptions['backend_options']存在,而且是数组,则$options等于

$cacheoptions['backend_options']

 

 

3.3

 

        switch (strtolower($type)) {

            case 'sqlite':

 

                if (extension_loaded('sqlite') && isset($options['cache_db_complete_path'])) {

                    $backendtype = 'sqlite';

                }

                break;

由3.1可以得出$type,如果

1>$type='sqlite',(sqlite是嵌入式关系数据库),

2>sqlite的需要加载的库文件已经加载

3>($options可以有3.2得出)$options['cache_db_complete_path']存在,则$backendtype='sqlite'

总结:

是通过$type的值,库文件的存在性,$options['cache_db_complete_path']是否存在值,进而决定$backendtype的值。

------------------>得出$backendtyoe的值

注:

$options['cache_db_complete_path'] = $cacheoptions['backend_options']['cache_db_complete_path']。

3.4

//4

            case 'memcached':

 

                if (extension_loaded('memcache')) {

                    if (isset($cacheoptions['memcached'])) {

                        $options = $cacheoptions['memcached'];

                    }

                    $enable2levels = true;

                    $backendtype = 'memcached';

                }

                break;

mencache:内存显示情况。

 

如果

存在memcached需要加载的库文件则$enable2levels = true;$backendtype ='memcached';

 

如果

1.存在memcached需要加载的库文件

2.isset($cacheoptions['memcached'])

则$options = $cacheoptions['memcached'].

 

如果条件成立->------------------>得出$enable2levels和$backendtype的值,对$options重新赋值

 

3.5

 case 'apc':

                if (extension_loaded('apc') && ini_get('apc.enabled')) {

                    $enable2levels = true;

                    $backendtype = 'apc';

                }

                break;

如果apc的库文件加载,而且int_get('apc.enabled')

则$enable2levels =true, $backendtype ='apc'

 

3.6

  case 'xcache':

                if (extension_loaded('xcache')) {

                    $enable2levels = true;

                    $backendtype = 'xcache';

                }

                break;

如果加载了xcache的扩展库文件,则$enable2levels=true,$backendtype='xcache'.

 

 

 

3.7

 

 case 'varien_cache_backend_eaccelerator':

                if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) {

                    $enable2levels = true;

                    $backendtype = 'varien_cache_backend_eaccelerator';

                }

                break;

如果eaccelerator的扩展库文件加载,ini_get('eaccelerator.enable')

$enable2levels = true;

$backendtype = 'varien_cache_backend_eaccelerator';

 

3.8

  case 'database':

                $backendtype = 'varien_cache_backend_database';

                $options = $this->getdbadapteroptions();

                break;

如果为database

$backendtype = 'varien_cache_backend_database';

                $options = $this->getdbadapteroptions();

3.8.1

 

 /**

     * get options for database backend type

     *

     * @return array

     */

    protected function getdbadapteroptions()

    {

        $options['adapter_callback'] = array($this, 'getdbadapter');

        $options['data_table']  = mage::getsingleton('core/resource')->gettablename('core/cache');

        $options['tags_table']  = mage::getsingleton('core/resource')->gettablename('core/cache_tag');

        return $options;

    }

得到$options['adapter_callback'] ,$options['data_table'],$options['tags_table']的值。

 

3.9

  default:

                if ($type != $this->_defaultbackend) {

                    try {

                        if (class_exists($type, true)) {

                            $implements = class_implements($type, true);

                            if (in_array('zend_cache_backend_interface', $implements)) {

                                $backendtype = $type;

                            }

                        }

                    } catch (exception $e) {

                    }

                }

        }

 

如果type不等于$this->_defaultbackend(此值为'file'),而且存在type这个类,这个类实现了zend_cache_backend_interface这个接口。

$backendtype = $type;

 

 

3.10

 if (!$backendtype) {

            $backendtype = $this->_defaultbackend;

            foreach ($this->_defaultbackendoptions as $option => $value) {

                if (!array_key_exists($option, $options)) {

                    $options[$option] = $value;

                }

            }

        }

3.10.1

 /**

     * default iotions for default backend

     *

     * @var array

     */

    protected $_defaultbackendoptions = array(

        'hashed_directory_level'    => 1,

        'hashed_directory_umask'    => 0777,

        'file_name_prefix'          => 'mage',

    );

 

 

 

如果backendtype没有值,也就是上面的这些情况下都没有给backendtype赋值,则等于默认值file($this->_defaultbackend),如果$this->_defaultbackendoptions的key值不存在于$options中,则将该key-value加入到$options。

 

 

3.11

//11

        $backendoptions = array('type' => $backendtype, 'options' => $options);

        if ($enable2levels) {

            $backendoptions = $this->_gettwolevelsbackendoptions($backendoptions, $cacheoptions);

        }

        return $backendoptions;

    }

 

 

3.11.1

$backendoptions = array('type' => $backendtype, 'options' => $options);

return $backendoptions

3.11.2

if ($enable2levels) {

            $backendoptions = $this->_gettwolevelsbackendoptions($backendoptions, $cacheoptions);

        }

        return $backendoptions;

3.11.2.1

 

 /**

     * initialize two levels backend model options

     *

     * @param array $fastoptions fast level backend type and options

     * @param array $cacheoptions all cache options

     * @return array

     */

    protected function _gettwolevelsbackendoptions($fastoptions, $cacheoptions)

    {

        $options = array();

        $options['fast_backend']                = $fastoptions['type'];

        $options['fast_backend_options']        = $fastoptions['options'];

        $options['fast_backend_custom_naming']  = true;

        $options['fast_backend_autoload']       = true;

        $options['slow_backend_custom_naming']  = true;

        $options['slow_backend_autoload']       = true;

 

        if (isset($cacheoptions['slow_backend'])) {

            $options['slow_backend'] = $cacheoptions['slow_backend'];

        } else {

            $options['slow_backend'] = $this->_defaultbackend;

        }

        if (isset($cacheoptions['slow_backend_options'])) {

            $options['slow_backend_options'] = $cacheoptions['slow_backend_options'];

        } else {

            $options['slow_backend_options'] = $this->_defaultbackendoptions;

        }

        if ($options['slow_backend'] == 'database') {

            $options['slow_backend'] = 'varien_cache_backend_database';

            $options['slow_backend_options'] = $this->getdbadapteroptions();

        }

 

        $backend = array(

            'type'      => 'twolevels',

            'options'   => $options

        );

        return $backend;

    }

 

//由于不是很懂cache,对于这些复杂的赋值,只知道赋值的结果,而不知道这些赋值有什么作用,现就分析到这里吧。总归

 

 $backendoptions = array('type' => $backendtype, 'options' => $options);

 

 return  $backendoptions

返回一个type和options的数组。

type指明类型:  file,database,eaccelerator,xcache,apc,memcached,sqlite等

options指明:   这个type需要用到的一个数值,options是一个数组,包含需要用到的值对。

 

 

 

 

4

$frontend   = $this->_getfrontendoptions($options);

 

 /**

     * get options of cache frontend (options of zend_cache_core)

     *

     * @param   array $cacheoptions

     * @return  array

     */

    protected function _getfrontendoptions(array $cacheoptions)

    {

        $options = isset($cacheoptions['frontend_options']) ? $cacheoptions['frontend_options'] : array();

        if (!array_key_exists('caching', $options)) {

            $options['caching'] = true;

        }

        if (!array_key_exists('lifetime', $options)) {

            $options['lifetime'] = isset($cacheoptions['lifetime']) ? $cacheoptions['lifetime'] : self::default_lifetime;

        }

        if (!array_key_exists('automatic_cleaning_factor', $options)) {

            $options['automatic_cleaning_factor'] = 0;

        }

        $options['cache_id_prefix'] = $this->_idprefix;

        return $options;

    }

 

 

 

 

 

 

 

5

 

 $this->_frontend = zend_cache::factory('varien_cache_core', $backend['type'], $frontend, $backend['options'],

            true, true, true

        );

 

 

mage_core_model_cache->_frontend的赋值:

5.1

 

  /**

     * factory

     *

     * @param mixed  $frontend        frontend name (string) or zend_cache_frontend_ object

     * @param mixed  $backend         backend name (string) or zend_cache_backend_ object

     * @param array  $frontendoptions associative array of options for the corresponding frontend constructor

     * @param array  $backendoptions  associative array of options for the corresponding backend constructor

     * @param boolean $customfrontendnaming if true, the frontend argument is used as a complete class name ; if false, the frontend argument is used as the end of "zend_cache_frontend_[...]" class name

     * @param boolean $custombackendnaming if true, the backend argument is used as a complete class name ; if false, the backend argument is used as the end of "zend_cache_backend_[...]" class name

     * @param boolean $autoload if true, there will no #require_once for backend and frontend (usefull only for custom backends/frontends)

     * @throws zend_cache_exception

     * @return zend_cache_core|zend_cache_frontend

     */

 

    public static function factory($frontend, $backend, $frontendoptions = array(), $backendoptions = array(), $customfrontendnaming = false, $custombackendnaming = false, $autoload = false)

    {

        if (is_string($backend)) {

//1

            $backendobject = self::_makebackend($backend, $backendoptions, $custombackendnaming, $autoload);

        } else {

            if ((is_object($backend)) && (in_array('zend_cache_backend_interface', class_implements($backend)))) {

                $backendobject = $backend;

            } else {

                self::throwexception('backend must be a backend name (string) or an object which implements zend_cache_backend_interface');

            }

        }

        if (is_string($frontend)) {

            $frontendobject = self::_makefrontend($frontend, $frontendoptions, $customfrontendnaming, $autoload);

        } else {

            if (is_object($frontend)) {

                $frontendobject = $frontend;

            } else {

                self::throwexception('frontend must be a frontend name (string) or an object');

            }

        }

        $frontendobject->setbackend($backendobject);

        return $frontendobject;

    }

 

 

 

 

 

5.1.1

 /**

     * frontend constructor

     *

     * @param string  $backend

     * @param array   $backendoptions

     * @param boolean $custombackendnaming

     * @param boolean $autoload

     * @return zend_cache_backend

     */

    public static function _makebackend($backend, $backendoptions, $custombackendnaming = false, $autoload = false)

    {

        if (!$custombackendnaming) {

//1

            $backend  = self::_normalizename($backend);

        }

        if (in_array($backend, zend_cache::$standardbackends)) {

            // we use a standard backend

            $backendclass = 'zend_cache_backend_' . $backend;

            // security controls are explicit

            #require_once str_replace('_', directory_separator, $backendclass) . '.php';

        } else {

            // we use a custom backend

            if (!preg_match('~^[/w] $~d', $backend)) {

                zend_cache::throwexception("invalid backend name [$backend]");

            }

            if (!$custombackendnaming) {

                // we use this boolean to avoid an api break

                $backendclass = 'zend_cache_backend_' . $backend;

            } else {

                $backendclass = $backend;

            }

            if (!$autoload) {

                $file = str_replace('_', directory_separator, $backendclass) . '.php';

                if (!(self::_isreadable($file))) {

                    self::throwexception("file $file not found in include_path");

                }

                #require_once $file;

            }

        }

        return new $backendclass($backendoptions);

    }

 

 

 

5.1.1

 /**

     * normalize frontend and backend names to allow multiple words titlecased

     *

     * @param  string $name  name to normalize

     * @return string

     */

    protected static function _normalizename($name)

    {

        $name = ucfirst(strtolower($name));

        $name = str_replace(array('-', '_', '.'), ' ', $name);

        $name = ucwords($name);

        $name = str_replace(' ', '', $name);

        return $name;

    }

 

标准化这个名字,例如由mage_core_model_config-->magecoremodelconfig.

 

 

 

总结:

 $this->_frontend = zend_cache::factory('varien_cache_core', $backend['type'], $frontend, $backend['options'],

            true, true, true

        );

返回值为

zend_cache_core|zend_cache_frontend,

 

 

 

6

  if (isset($options['request_processors'])) {

            $this->_requestprocessors = $options['request_processors'];

        }

 

总结:

 

根据传入值$options,

得到

1

$this->_defaultbackendoptions['cache_dir'] = mage::getbasedir('cache');

2

$this->_idprefix

3

//backend和$frontend类型为数组。返回一个包含type和options的数组。

$backend    = $this->_getbackendoptions($options);

$frontend   = $this->_getfrontendoptions($options);

 

进而得出

 $this->_frontend = zend_cache::factory('varien_cache_core', $backend['type'], $frontend, $backend['options'],

            true, true, true

        );

$this->_frontend 为zend_cache_core|zend_cache_frontend类型

4

$this->_requestprocessors = $options['request_processors'];

 

对cache的机制了解不是很多,还处于模糊阶段,所以对magento的核心cache不能有很好的理解,就先这样吧,知道个大体结构。到此为止。。

 

magento 的cache机制是zendframework框架的,所以,研究这个框架再回来看magento的核心内存机制cache。


http://www.ngui.cc/el/5126632.html

相关文章

学做程序经理--转

学做程序经理 指派一名优秀的程序经理,是团队产出优秀软件的重要前提之一。你的团队里可能没有这样的人,其实绝大多数团队都没有。 charles simonyi,这位曾与martha stewart(译者注:美国女富豪,作家&…

css中cursor属性详解

css中cursor属性详解 语法: cursor : auto | all-scroll | col-resize| crosshair | default | hand | move | help | no-drop | not-allowed | pointer | progress | row-resize | text | vertical-text | wait | *-resize | url ( url ) 取值: …

相关产品设置插件

这个插件安装要求先装enhanced admin product grid这个插件 magento-community/tbt_enhancedgrid 2 magento -- 推荐插件 -- mass product relater 收藏 名称: mass product relater extension key:magento-community/mass_product_relater 网址: http://www.magentoc…

深入理解magento – 第三章 – magento的布局(layout),块(block)和模板(template).doc

深入理解magento – 第三章 – magento的布局(layout),块(block)和模板(template) 我们接着研究magento。根据我们第二章讲的magento mvc的架构,我们接下来应该讲模型(model),但是我们跳过模型先来看布局和块。和一些…

深入理解magento – 第四章 – 模型和orm基础.doc

深入理解magento – 第四章 – 模型和orm基础 对于任何一个mvc架构,模型(model)层的实现都是占据了很大一部分。对于magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码(可以说…

深入理解magento – 第五章 – magento资源配置.doc

深入理解magento – 第五章 – magento资源配置 对于任何一个更新频繁的项目来说,保持开发环境和生产环境的数据库同步是件很头疼的事情。magento提供了一套系统,用版本化的资源迁移脚本来解决这个问题。 上一章,我们为 helloworld blogpos…

深入理解magento – 第六章 – 高级magento模型.doc

深入理解magento – 第六章 – 高级magento模型 我们讲过magento有两种模型,简单模型和eav(entity attribute value)模型。上一章我们讲过所有的magento模型都是继承自mage_core_model_abstract / varien_object。简单模型和eav模型的区别在…

model--resourcemodel---collection 初始化

model 不是eav模型的初始化。 1 class richardmason_profile_model_profile extends mage_core_model_abstract{ public function _construct() { parent::_construct(); $this->_init(profile/profile); } 1.1 parent::parent为空; 1.2 //abstract class m…

magento----设置图片背景颜色(按数值设定后缺的部分用背景色填充)

1. magento图片的底层处理是在:/lib/varien/image/adapter/abstract.php 函数: public function backgroundcolor($value null) /** * get/set keepbackgroundcolor * * param array $value * return array */ public f…

magento -- 用magento的方式读写xml

magento -- 用magento的方式读写xml i will be using varien_simplexml_element class to read write xml nodes. the path to this class file is lib/varien/simplexml/element.php here is a sample xml file which i am going to read through magento code. i will al…
网站地图