【发布时间】:2014-01-12 05:11:54
【问题描述】:
我有一个托管在 AWS Elastic Beanstalk 上的 CakePHP 应用程序。由于将来我将使用多个 EC2 实例,我想将我的 PHP 会话存储在数据库中。 AWS 提供了一个非常好的库,用于在其 DynamoDB 数据库中存储 PHP 会话。见http://goo.gl/URoi3s
现在我将 AWS 开发工具包放在了我的供应商文件夹中,并为它创建了一个访问包装器(一个插件):
<?php
Configure::load('aws');
require_once VENDORS . 'autoload.php';
use Aws\Common\Aws;
class AwsComponent extends Component
{
private $_aws;
public function __construct()
{
$this->_aws = Aws::factory(array(
'key' => Configure::read('Aws.key'),
'secret' => Configure::read('Aws.secret'),
'region' => Configure::read('Aws.region')
));
}
public function getClient($service)
{
return $this->_aws->get($service);
}
}
包装器运行良好,我已经实现了一些 S3 的东西。现在对于会话处理程序,我将以下代码添加到我的 AppController.php:
public $components = array('Aws.Aws');
public function beforeFilter()
{
$this->_setSessionStorage();
}
private function _setSessionStorage()
{
$client = $this->Aws->getClient('dynamodb');
$client->registerSessionHandler(array(
'table_name' => 'sessions'
));
}
AWS 的内部 registerSessionHandler() 已执行(经过测试),但会话并未存储到 DynamoDB 表中。当然,我之前创建了表,如果我在加载调度程序之前将对 AWS 库的调用直接添加到我的 webroot/index.php 中,一切正常。
我认为问题在于我的代码是在 CakePHP 调用 session_start() 之后执行的。那么实现它的最佳方法是什么? http://goo.gl/kUFUIR 对我没有帮助,我不想重写 AWS 库以兼容 CakePHP 接口。
【问题讨论】:
标签: cakephp amazon-web-services amazon-dynamodb php