跨会话缓存

时间:2014-01-26 22:23:48

标签: php zend-framework caching

是否有任何交叉(-user)-session缓存机制?

问题是:

  • 我正在构建一个Magento模块(Linux上的Magento + Zend),它经常触发SOAP查询;
  • 其中一些查询只是为了请求sessionID,因此可以使用超时控制保存(考虑每个sessionID持续一小时)
  • 那些sessionId与服务器到服务器的通信有关;与当前用户会话无关(例如,备份操作)。那就是说,我并不担心一个人冒充另一个人;

我听说过几个关于APC的坏事/帖子 - 所以我把它丢弃了。让我知道你是否有任何好的论据让我们重新考虑它作为一种选择。

MemCached看起来是一个很好的选择,因为它看起来已经在Zend中实现了某种类型的lib来处理它。

基本上,我担心减少这个sessionId请求。

非常感谢!

更新

下面的答案实际上没有解决问题,但是评论做到了。 Zend_Cache(由@Rijndael提到)是我的情况的解决方案。最终的代码应该与此非常相似:

$frontendOptions = array(
   'lifetime' => 7200, // cache lifetime of 2 hours
   'automatic_serialization' => true
);

$backendOptions = array(
    'cache_dir' => './tmp/' // Directory where to put the cache files
);

// getting a Zend_Cache_Core object
$cache = Zend_Cache::factory('Core',
                             'File',
                             $frontendOptions,
                             $backendOptions);

if( ($result = $cache->load('myresult')) === false ) {

    // cache miss; connect to the database 
    $db = Zend_Db::factory( [...] );
    $result = $db->fetchAll('SELECT * FROM huge_table');
    $cache->save($result, 'myresult');
} else {
    // cache hit! shout so that we know
    echo "This one is from cache!\n\n";
}
print_r($result);

http://framework.zend.com/manual/1.12/en/zend.cache.introduction.html

1 个答案:

答案 0 :(得分:1)

不确定magento的细节,但作为ZF开发人员,有几种方法可以解决这个问题:

如果通过跨会话指的是存在于同一服务器上但位于不同子域下的应用程序,则可以执行以下操作:

在application.ini中:

session.domaincookie = .mysite.co.uk ; 

然后在bootstrap中,

Zend_Session::setOptions($this->getOption('session'));

上述方法将使会话数据在所有子域中可见。

如果是第三方API,则只将sessionId存储在本地会话中:

$s = new Zend_Session_Namespace("user_session");
$s->session_id = $api->session_id;
$s->setExpirationSeconds(strtotime("+1 hour"));

不要使用APC,这是一个冷清的项目。如果需要内存缓存,请使用Redis或Memcached。您也可以使用Zend_Cache。