将PHP会话保存到PhpRedis中
简要介绍/概述
在PHP的Redis通信扩展PhpRedis中,除了与普通的Redis进行输入输出交互外,还提供了保存PHP会话的功能。
默认情况下,PHP会话以文件的形式保存在/tmp或/var/tmp等临时目录中。在预计会有高负载的服务器环境中,如果对文件输入输出IO有所顾虑,可以考虑使用内存中的KVS数据库,如memcached或Redis。而PhpRedis可能会成为其中的一个选择。
安装
PhpRedis的安装在Linux系统下可以通过yum或apt-get,macOS可以通过HomeBrew或MacPorts,*BSD系统可以通过ports collection等各种软件包管理系统来使用。此外,如果我写的这篇文章对您有所帮助,那就再好不过了。
在macOS(Mac OS X)上安装PhpRedis可以参考以下步骤。
设定
根据PhpRedis GitHub上的README.markdown,PhpRedis在php.ini中进行处理器设置,从而实现对PHP会话的保存支持。
要保存PHP会话,需要在php.ini文件中设置如下两行内容。
# grep ^session /opt/local/etc/php56/php.ini
session.save_handler = redis
session.save_path = "tcp://localhost:6379"
(以下略)
第一行声明将Redis用作处理程序。默认情况下,此处为”files”,需要将其更改。
如果您对更改感到犹豫,可以将此行复制,并将”files”行注释掉,然后将复制的行中的”files”替换为”redis”。
第二行是保存路径。在files情况下,这里会指定一个目录路径,如/tmp等,但在redis中,通过TCP进行连接,所以指定为tcp://localhost:6379。
需要注意的是localhost部分,这里需要指定一个redis-server可以建立连接(能够通过TCP发送和接收数据)的地址,可以是主机名或IP地址。
主机名(IP地址)右侧的冒号,再向右的数字是端口号,默认情况下Redis使用6379/TCP。如果使用不同的端口号,请将此处的值设为相同的值。
有几个选择可以添加,可以在多台服务器上运行,或者设置超时等其他要求(稍后有更详细的说明)。
确认操作
现在,这样操作真的会被保存在Redis中吗?
因此,我将进行操作确认。事先需要启动redis-server。
# redis-server &
接下来,我们准备一个名为session.php的测试代码,用于使用PHP会话。
<?php
session_start();
echo "save_handler=" . ini_get("session.save_handler") . "\n";
echo "save_path=" . ini_get("session.save_path") . "\n";
echo "session_id=" . session_id() . "\n";
$_SESSION['libname'] = "PhpRedis";
在执行测试代码之前,有一些必要的确认工作需要完成。
当然,在此时需要确认Redis中没有任何信息(至少没有PHP会话ID)。
> redis-cli
127.0.0.1:6379> keys *
(empty list or set)
在这种情况下,我们可以确认没有任何关键信息,因此可以放心进行操作确认。
现在,我们来尝试执行刚才的session.php文件。
> php56 session.php
save_handler=redis
save_path=tcp://localhost:6379
session_id=h59pqds8s5sdj9j0anmiqh63s0
如果save_handler和save_path与之前在php.ini中设置的相同,则配置和测试代码似乎匹配正确。
这个地方非常重要的部分是,如果显示的session_id与Redis中保存的相同,那就意味着成功。让我们尝试使用redis-cli命令来确认一下。
> redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:h59pqds8s5sdj9j0anmiqh63s0"
似乎包含了密钥并成功进行了与Redis通信,密钥已保存。
我们可以尝试使用redis-cli通过会话ID作为键来检索已经存储在$_SESSION[“libname”]中的值。
127.0.0.1:6379> get PHPREDIS_SESSION:h59pqds8s5sdj9j0anmiqh63s0
"libname|s:8:\"PhpRedis\";"
看起来这个也被保存了。就像文件中保存了PHP会话一样,它是通过PHP序列化保存的。可以说,即使保存的位置(save_handler)发生变化,保存的内容本身也是相同的(当然是理所当然的)。
请选择以下中文的一种选项翻译成日语:
最后,我会简单介绍一下可用的选项。有关说明本身,请参阅PhpRedis的GitHub存储库中README.markdown文件的PHP Session处理器部分。
在前面的README.markdown文档中关于PHP会话处理程序的部分中,已经写明了选项的指定方式(以下节选)。
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"