全新的Phalcon(以及一般的框架)请原谅我的n00b-ness。
我想在我的bootstrap文件中加载我的配置,然后将它存储在会话中(因此它只需要加载一次,并且可以全局访问)。
我已经创建了会话,并且我已成功将配置信息加载到$ 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()
存储它。
答案 0 :(得分:3)
您是否只想加载一次配置来加速您的应用?如果有的话,你是否对应用程序进行了分析以确保它实际上是一个瓶颈?
我有一个55行配置文件并使用xdebug和qcachegrind我可以看到加载配置文件需要占总页面加载量的0.04%。在我的案例中可能有更容易的节省!
您使用的是操作码缓存吗?我使用APC非常成功,但由于一些间歇性的问题(在PHP 5.5中是标准的),最近改为支持opcache。根据我的经验,操作码缓存可以提高50%的速度,ymmv < / p>
如果你已经完成了它并且仍然不够快,那么我会同意其他人并说在会话中存储配置并不是一个好主意,因为每个访问者都有他们自己的,内存使用也可能是如果您有很多用户,或者如果您的会话存储在文件中,那么您可能会将一个配置文件交换数百个!
如果你认为缓存可能值得尝试,可以这样:改编自手册:
//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);
}
但我认为你在寻求速度方面可能会更好地花在其他地方。
答案 1 :(得分:2)
我发现Vokuro示例应用程序是了解Phalcon应用程序结构的一种非常有用的方法。如果您尝试在控制器代码中使配置可用,那么使用依赖注入可能就是您所需要的,您也可能不需要将配置存储在会话中。祝你的旅程顺利。