Phalcon:在会话中存储配置


Phalcon: Store config in session

Phalcon(以及一般框架)是全新的,所以请原谅我的n00b。

我想在引导文件中加载我的配置,然后将其存储在会话中(因此它只需要加载一次,并且可以全局访问)。

我已经创建了我的会话,并且我正在成功地将我的配置信息加载到$Config中。如何在会话中存储$Config?由于我不在控制器中,所以我不能使用$this->session。似乎唯一的方法是将会话从DI中拉出,添加$config属性,然后重新设置DI的会话属性:

$DI->setShared('session', function(){
    $session = new Phalcon'Session'Adapter'Files();
    if(session_status() == PHP_SESSION_NONE)
        $session->start();
    return $session;
});
$Config = require '../app/config/config.php';
$Session = $DI->get('session');
$Session->config = $Config;
$DI->setShared('session',$Session);

尽管这似乎是一种非常低效的方式来将会话中的某些内容存储在引导程序中。这是唯一的方法吗?还是我缺少了一些隐藏的功能?我想我可以手动创建会话(而不是在匿名函数中),设置"config",然后将其存储在$DI->setShared()中。

您是否试图通过只加载一次配置来加快应用程序的速度?如果是的话,你有没有分析过这个应用程序,以确保它实际上是一个瓶颈?

我有一个55行的配置文件,使用xdebug和qcachegrind,我可以看到加载配置文件占用了我整个页面加载量的0.04%。在我的情况下,可能有更容易的储蓄!

您正在使用操作码缓存吗?多年来,我非常成功地使用了APC,但最近由于一些间歇性问题,我改为使用opcache(这是php 5.5中的标准配置)。根据我的经验,操作码缓存可以提高50%的速度,ymmv

如果你已经这样做了,但仍然不够快,那么我同意其他人的观点,并说将配置存储在会话中不是一个好主意,因为每个访问者都有自己的配置。如果你有很多用户,内存使用也可能是一个问题,或者如果你的会话存储在文件中,那么你可能会将一个配置文件换成数百个!

如果你认为缓存可能值得一试,可以这样做:改编自手册:

//Cache data for one hour
$frontCache = new Phalcon'Cache'Frontend'Data(array(
    "lifetime" => 3600
));
// Create the component that will cache "Data" to a "Memcached" backend
// Memcached connection settings
$cache = new Phalcon'Cache'Backend'Memcache($frontCache, array(
    "host" => "localhost",
    "port" => "11211"
));
// Try to get cached records
$cacheKey = 'site-config';
$config    = $cache->get($cacheKey);
if ($config === null) {
    $config = require '../app/config/config.php';
    // Store it in the cache
    $cache->save($cacheKey, $config);       
}

但我认为,为了追求速度,你的时间可能会更好地花在其他地方。

我发现Vokuro示例应用程序是了解Phalcon应用程序结构的一种非常有用的方法。如果您试图在控制器代码中提供配置,那么您可能需要使用依赖项注入,也可能不需要将配置存储在会话中。祝你旅途愉快。