在Symfony3系中,使用Redis来保持会话
不同会话的处理程序
在Symfony3中,默认情况下,会将会话保存到文件中,并使用名为NativeFileSessionHandler的类。此外,还有许多用于会话的处理程序,例如用于使用MongoDB作为会话的MongoDbSessionHandler和用于使用Memcache的MemcacheSessionHandler等。
然而… ér…)
没有Redis处理程序
Redis的处理程序没有内置。有Memcache,却没有Redis。真是讨厌。顺便说一下,在Symfony4中,Redis的处理程序似乎从一开始就被内置了。
由于开发包的要求,必须使用Symfony3,但仍然想使用Redis。可能会出现这种情况。
实现Redis会话处理程序
参考了这个网站并进行了实现。
虽然该网站基于Symfony2进行了解释,但几乎没有变化。
环境
PHP: 7.2 => PHP:7.2
Symfony: 3.4 => Symfony:3.4
处理程序的实现
<?php
namespace App\Common;
use \Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
class NativeRedisSessionHandler extends NativeSessionHandler
{
/**
* Constructor.
*
* @param string $savePath Path of redis server.
*/
public function __construct($savePath = "", $maxlifetime = 432000)
{
if (!extension_loaded('redis')) {
throw new \RuntimeException('PHP does not have "redis" session module registered');
}
if ("" === $savePath) {
$savePath = ini_get('session.save_path');
}
if ("" === $savePath) {
$savePath = "tcp://localhost:6379"; // guess path
}
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', $savePath);
ini_set('session.gc_maxlifetime', $maxlifetime);
}
}
YAML的实现
在yaml文件中,为框架添加会话处理程序的指定。
services:
session_handler_redis:
class: App\Common\NativeRedisSessionHandler
arguments: ['%session_redis_path%', '%session_redis_max_lifetime%']
framework:
session:
handler_id: session_handler_redis
parameters:
session_redis_path: 'tcp://localhost:6379'
session_redis_max_lifetime: 432000
增加套餐
使用上述的处理程序时,需要安装适用于PHP的包来处理Redis。
为了进行上述的实现,我使用了phpredis。
在Docker的PHP镜像中,您可以使用以下命令进行安装。
RUN git clone -b 4.3.0 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install redis
现在你可以在Symfony3中使用Redis了!
最终
希望Symfony的生活美好!