使用FuelPHP进行会话共享的注意事项
太长不想读;简言之。
如果要在多个节点上使用Memcache或RDBMS等来共享FuelPHP的会话信息,
- app/config/crypt.php
需要在多个节点上设置相同的值。
背景 –

我将在下面列出使用 FuelPHP 进行此类构建时需要注意的事项。
尽管图表和后续的解释中使用了 ElastiCache(Redis),但注意点适用于无论是 RDBMS 还是普通的 Memcache。
指定会话存储
在 FuelPHP 中,首先需要在 app/config/session.php 中指定会话存储设置。(如果想根据环境进行配置更改,可以在 config/staging/session.php 等文件中进行记录即可。)
如果要使用Redis,则session.php的代码应如下所示。
<?php
return array(
'driver' => 'redis',
'redis' => array(
'cookie_name' => 'fuelrid',
'database' => 'default',
),
);
在Redis的情况下,需要将连接信息添加到db.php文件中。
<?php
return array(
'redis' => array(
'default' => array(
'hostname' => 'xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com',
'port' => 6379,
'timeout' => null,
)
),
);
如果您想使用其他系统作为会话存储等,请参考下面的官方文档。
- http://fuelphp.jp/docs/1.7/classes/session/config.html
暗号密钥设置
所以,重要的是从这里开始,仅有这样的设置无法实质上共享会话。
每当负载均衡器将请求发送到另一个节点时,会出现无法维持会话的症状。(根据环境设置的方式不同,下面的信息可能相同,因此可能会意外地正常工作)
这是因为在FuelPHP中,当设置会话ID为Cookie名称时会进行加密,而导致此问题的原因是加密密钥在每个节点上都不同。
这个加密密钥默认情况下没有被设置,在需要时才会自动在app/config/crypt.php中生成。
文件的内容如下。
<?php
return array(
'crypto_key' => '9eEBP8okkcz4xAo9rU5h4f7Q',
'crypto_iv' => 'HncqRUWjEl2Y53sqawnK4Y7Q',
'crypto_hmac' => 'ra4OxkVxYthofVMlAk0ncQrQ',
);
将此内容在多个节点上保持一致。
需要使用crypto_key、crypto_iv和crypto_hamc这三个参数,并且每个参数都需要满足以下条件。否则,将会重新生成并且在每个节点上都会有不同的值。
-
- base64デコード可能な文字列
- 文字列の長さは4の倍数
如果查看core/classes/crypt.php中的_init()方法,我认为你就会明白。
通过从中提取的片段,可以使用以下代码生成生成加密密钥所需的值。
<?php
function safe_b64encode($value)
{
$data = base64_encode($value);
$data = str_replace(array('+','/','='), array('-','_',''), $data);
return $data;
}
$crypto = '';
for ($i = 0; $i < 8; $i++)
{
$crypto .= safe_b64encode(pack('n', mt_rand(0, 0xFFFF)));
}
echo $crypto . "\n";
请谨慎考虑
-
- http://madroom-project.blogspot.jp/2013/03/fuelphpredis.html
-
- http://9jp.info/archives/12368
-
- http://dev.classmethod.jp/cloud/aws/php-session-elasticache/
- http://qiita.com/supertaihei02/items/f3ef9148fd5235ee2816