magento session保存在哪里(Magento Session存储方式及实现原理分析)
摘要:
Magento是一种开源电子商务平台,拥有大量的商用和社区用户。作为一个功能强大的电商平台,它需要一个高效的存储系统来为当前正在操作的用户提供数据的保持和获取服务。Magento采用了不同的会话存储方式来存储这些会话信息,包括文件存储、数据库存储和Memcached存储。 在本文中,我们将通过讨论Magento Session的存储方式及实现原理,以探讨Magento如何管理和存储会话信息的流程和优化技术。
正文:
一、文件存储
Magento中最常用的会话存储方式是将会话信息存储在文件中。这种存储方式简单、易用,适用于小型的服务器,但是不适用于大型服务器,因为它会导致文件系统上的I/O操作。
在Mage_Core_Model_Session中,Magento定义了存储路径和文件名模板:
“`php
class Mage_Core_Model_Session extends Zend_Session_Namespace
{
const SESSION_NAMESPACE = ‘core’;
protected $_session = null;
protected $_sessionPath = null;
protected $_sessionName = null;
protected $_sessionIdRegenerated = false;
protected $_isSessionBeingStarted = false;
public function __construct()
{
$this->_sessionPath = Mage::getBaseDir(‘session’);
$this->_sessionName = ‘m’.md5(Mage::getBaseUrl());
$this->init(self::SESSION_NAMESPACE);
}
…
“`
在这个类中,Magento将会话信息存储在session目录中的一个以Magento网站的URL作为命名的文件中。这个文件的名称被设置为Mage::getBaseUrl()的MD5哈希值。
当启用文件存储时,在session目录中会生成一个以session ID为后缀的文件,例如session文件名为“90329a486b1788de0d36628d43efede6”,对应的session ID为“90329a486b1788de0d36628d43efede6”。
缺点是当前正在操作的用户数量增加时,系统必须创建和读取更多的文件,这有效地降低了系统的性能。因此,Magento不推荐这种方式。
二、数据库存储
Magento还支持将会话信息存储在数据库中。使用此方法可以解决文件存储方式的性能问题,而不需要在系统上进行I/O操作。Magento支持使用任何支持Zend框架的数据库系统(例如MySQL,PostgreSQL等)做会话存储。
Magento使用的是Zend_Session_SaveHandler_DbTable作为会话存储的处理程序。此处理程序通过为每个会话创建一条记录来存储所有会话信息。
Magento在Mage_Core_Model_Resource中定义了数据库表和字段:
“`php
class Mage_Core_Model_Resource extends Mage_Core_Model_Resource_Db_Abstract
const ENTITY_TYPE_MODULE = ‘module’;
const ENTITY_TYPE_RESOURCE_MODEL = ‘resource_model’;
const ENTITY_TYPE_BLOCK = ‘block’;
const ENTITY_TYPE_CONFIG_DATA = ‘config_data’;
const ENTITY_TYPE_TRANSLATE = ‘translate’;
const ENTITY_TYPE_TRANSLATE_STRING = ‘translate_string’;
const ENTITY_TYPE_CACHE = ‘cache’;
const ENTITY_TYPE_WEB_DEFAULT_PRODUCT = ‘web_default_product’;
const ENTITY_TYPE_CRON_SCHEDULE = ‘cron_schedule’;
const ENTITY_TYPE_INDEX = ‘index’;
const ENTITY_TYPE_STORE = ‘store’;
const ENTITY_TYPE_STORE_GROUP = ‘store_group’;
const ENTITY_TYPE_WEBSITE = ‘website’;
protected $_resourceConnection;
protected $_resourceName;
protected $_resource;
“`
通过定义这些常量,Magento创建了下面的会话表:
“`sql
CREATE TABLE `core_session` (
`session_id` VARCHAR( 255 ) NOT NULL COMMENT ‘Session Id’ ,
`session_data` TEXT NULL COMMENT ‘Session Data’ ,
`session_lifetime` INT( 10 ) UNSIGNED DEFAULT NULL COMMENT ‘Session Lifetime’ ,
PRIMARY KEY ( `session_id` )
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = ‘Core Session’
“`
在创建会话表后,Magento创建并注册会话处理程序:
“`xml
…
“`
在使用数据库存储时,Magento将会话数据存储在本地数据库中。由于数据库系统可以处理数千个并发连接,因此此存储方式适用于大型服务器。
三、Memcached存储
Magento还支持使用Memcached作为会话存储,Memcached是一种分布式内存对象缓存系统。这种会话存储方式是高级的,可以极大地提高系统性能,它可以提供快速读写,支持多种数据类型。
在Mage_Core_Model_Session中,Magento定义了Memcached存储和读取逻辑。
“`php
class Mage_Core_Model_Session extends Zend_Session_Namespace
…
const SESSION_NAMESPACE = ‘core’;
protected $_session = null;
protected $_sessionPath = null;
protected $_sessionName = null;
protected $_sessionIdRegenerated = false;
protected $_isSessionBeingStarted = false;
protected $_memcached = null;
protected $_memcachedConfig = null;
public function __construct()
{
if (($config = $this->_getMemcachedConfig()) && ($this->_memcached = Mage::helper(‘core’)->getMemcacheInstance($config))) {
$this->setSaveHandler(array($this, ‘open’), array($this, ‘close’), array($this, ‘read’), array($this, ‘write’), array($this, ‘destroy’), array($this, ‘gc’));
$saveHandler = ‘memcached’;
}
$saveHandler = Mage::getStoreConfig(‘session_handler’);
if(!$saveHandler){
$saveHandler = ‘files’;
}
switch ($saveHandler) {
case ‘memcached’:
// set save handler to memcached
break;
default:
// set save handler to file
break;
}
parent::__construct(self::SESSION_NAMESPACE);
}
“`
中,Magento在使用Memcached之前,首先检查是否有已经定义的Magcached实例配置和工厂类。再在Mage_Core_Helper_Data类中定义了getMemcacheInstance方法,以创建和配置Memcache实例。
“`php
class Mage_Core_Helper_Data extends Mage_Core_Helper_Abstract
public function getMemcacheInstance($config)
{
if ($this->_memcache === null) {
$this->_memcache = new Memcache();
if (!is_array($config)) {
$config = array($config);
}
foreach ($config as $cfg) {
if (!isset($cfg[‘host’])) {
continue;
}
$host = $cfg[‘host’];
$port = isset($cfg[‘port’]) ? $cfg[‘port’] : ‘11211’;
$persistent = isset($cfg[‘persistent’]) ? $cfg[‘persistent’] : false;
$weight = isset($cfg[‘weight’]) ? $cfg[‘weight’] : 1;
$this->_memcache->addServer($host, $port, $persistent, $weight);
}
}
return $this->_memcache;
}
“`
Magento还需要在Magento的全局配置文件中指定保存处理程序:
“`xml
…
“` 当Magento启用Memcached存储时,系统将使用Zend_Session_SaveHandler_Memcached作为存储处理程序。Magento在将了处理程序之后,将通过Mage_Core_Model_Session_Abstract_Varien中的以下方法管理存储信息。 “`php abstract class Mage_Core_Model_Session_Abstract_Varien implements ArrayAccess … protected $_sessionSaveMethod = ‘files’; protected $_session; protected $_sessionWriteLock = false; protected $_sessionIdRegenerated = false; protected $_sessionHosts = array(); protected $_sessionConfigInitialized = false; protected function _getSaveHandler() { if (!$this->getSaveHandlerConfig()) { return null; } if ($this->getSaveHandlerConfig()->getSaveHandler() == ‘memcached’) { return Mage::getSingleton(‘core/memcached’); } return parent::_getSaveHandler(); } … “` 通过这种方式,Magento可以将会话存储在Memcache服务器上,并且能够高效地进行读取和写入操作,这对缩短页面加载时间和提高用户体验来说是非常重要的。 四、实现原理 不管使用哪种类型的会话存储方式,Magento的目标是为了优化当前用户正在使用的数据而选择有效的方式。无论是删除不再需要的会话,更新活动会话的时间戳,还是根据存储策略获取会话信息,Magento需要遵循以下几个步骤: 1.初始化会话处理程序并将其注册为PHP会话处理程序 这一步需要在Magento的入口文件中完成。Magento将全局的会话控制从PHP会话处理程序中获取,并使用App对象作为保存或恢复Magento会话的管理程序。 在Magento中,主要支持三个存储方式: – 文件存储:文件会话处理程序通过将会话信息存储在文件系统中的一个文件中来管理会话数据。 – 数据库存储:数据库会话处理程序将会话信息存储在数据库中,以便更快地管理数据,并产生更好的性能。 – Memcached存储:将会话信息存储在Memcached服务器中,以确保应用程序具有快速,可伸缩,可靠的存储。 2.处理保存的会话数据 由于会话数据可以在文件系统中,数据库中,还是Memcache服务器中,因此Magento需要将数据存储在每个存储媒介中,并根据需要更新它们。 3.处理会话ID Magento为每个会话分配一个唯一标识符,并使用该标识符对数据进行检索。在存储和恢复会话中,将使用session ID来管理和检索数据。 4.清除不需要的会话数据 Magento需要及时清理不再需要的会话数据以释放服务器资源和缓存空间。 结论: 在本文中,我们介绍了Magento的会话存储方式,包括文件存储、数据库存储和Memcached存储,以及Magento使用的相关实现原理。通过这些存储方式的分析,我们可以看到各自的优势和缺陷,并了解如何选择最适合Magento应用程序的方式。同时,我们还分析了Magento管理和存储会话信息的流程和优化技术,这对于确保系统性能的最佳状态和提高用户体验来说至关重要。
如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。