2

对 Phalcon(和一般框架)来说是全新的,所以请原谅我的 n00b-ness。

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

我已经创建了我的会话,并且我成功地将我的配置信息加载到 $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);

尽管这似乎是在引导程序中的会话中存储某些东西的一种非常低效的方式。这是唯一的方法还是我错过了一些隐藏的功能?我想我可以手动创建会话(而不是在匿名函数中),设置“配置”,然后将其存储为$DI->setShared().

4

2 回答 2

3

您是否试图通过仅加载一次配置来加速您的应用程序?如果是这样,您是否对应用程序进行了分析以确保它实际上是一个瓶颈?

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

你在使用操作码缓存吗?我多年来非常成功地使用APC ,但最近由于一些间歇性问题而改用 opcache (它是 php 5.5 中的标准)根据我的经验,opcode 缓存可以提高 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);       
}

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

于 2013-07-31T11:32:13.003 回答
2

我发现 Vokuro 示例应用程序是了解 Phalcon 应用程序结构的非常有用的方法。如果您尝试使配置在您的控制器代码中可用,则可能需要使用依赖注入,您可能也不需要将配置存储在会话中。祝你好运。

于 2013-07-05T20:45:13.170 回答