【问题标题】:Phalcon: Store config in sessionPhalcon:在会话中存储配置
【发布时间】:2013-07-05 20:29:21
【问题描述】:

对 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()

【问题讨论】:

  • Config里面是什么,为什么要把它存到session里?它是用户特定的吗?否则每个用户都会有一个相同的副本?你确定你不只是在寻找缓存吗? docs.phalconphp.com/en/latest/reference/cache.html
  • 不,它不是特定于用户的,只是特定于应用程序的属性(即:控制器/模型/视图目录所在的位置、数据库凭据、ACL 内容)。我会查看缓存 - 这可能是我想要的。
  • 因为如果您将它存储在会话中 - 它将为每个用户复制。这不是优化,而是减慢速度。它是否可以被优化可能是个问题(在内存(apc)中存储和执行轻代码可能比将其结果存储在硬盘上更快)。

标签: php frameworks phalcon


【解决方案1】:

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

我有一个 55 行的配置文件,并使用 xdebugqcachegrind 我可以看到加载配置文件占用了我整个页面加载的 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);       
}

但我认为你最好把时间花在追求速度的其他地方。

【讨论】:

  • 感谢您的回答。出于与您概述的几乎相同的原因,我放弃了这个想法。
  • 是的,当然。 [添加字符以达到限制]
【解决方案2】:

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

【讨论】:

  • 感谢您的提示。如果我唯一的愿望是在处理请求时在整个应用程序中全局访问配置属性,我会使用依赖注入 (DI)。但是,我正在尝试查看是否可以让每个用户会话只读取一次配置信息,而不是每次页面加载一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2020-12-05
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多