Php 跨会话缓存

Php 跨会话缓存,php,zend-framework,caching,Php,Zend Framework,Caching,是否存在跨(-user)会话缓存机制 问题是: 我正在构建一个经常触发SOAP查询的Magento模块(Linux上的Magento+Zend) 其中一些查询只是请求sessionID,因此可以使用超时控件保存它(考虑到每个sessionID持续一小时) 这些sessionId与服务器到服务器的通信有关;与当前用户会话(例如备份操作)没有关系。也就是说,我不担心一个人冒充另一个人 我听过一些关于APC的不好的事情/帖子-所以我把它放在一边。如果你有什么好的理由让我重新考虑它作为一个选项,请告

是否存在跨(-user)会话缓存机制

问题是:

  • 我正在构建一个经常触发SOAP查询的Magento模块(Linux上的Magento+Zend)
  • 其中一些查询只是请求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);

不确定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_缓存。

我所说的跨会话是指跨(-user)-会话。整个应用程序将在同一服务器跨用户会话中运行?相同的URI和用户?具体的设置是什么?如果在一个用户会话期间,我需要向给定的服务器请求sessionId,为什么我要向另一个针对同一服务器的用户请求另一个requestId?Zend_会话_名称空间不是对所有用户都可见的,它是一个仅对一个用户可见的信息。对吗?每个用户的会话ID都是唯一的。不能有两个用户具有相同的会话ID。让我这样告诉你,如果我偷了你的会话ID,我就可以冒充你,不是个好主意吗?我明白了。如果您正在重用会话ID,那么最好的办法就是简单地缓存它们。您可以使用Zend_缓存缓存ID。如果愿意,您可以使用memcached backend进行zend_缓存。见: