将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处理器部分。

オプション型デフォルト意味weight整数(integer)1ホスト(サーバ)の重み付けの値。PHPセッションを複数のRedisホストに分散して保存する場合の比重を設定することができる。あるRedisサーバAが別のRedisサーバBの2倍の重みを持っているとしたら、Aは2倍のセッションを保持することになる。timeout小数(float)86400Redisサーバへのコネクションタイムアウトまでの秒数。この時間以内にRedisサーバに接続できなかった場合、クライアントはセッションを利用できない。persistent0もしくは10永続的コネクションで利用する場合は1を指定する(試験的オプション)。prefix文字列PHPREDIS_SESSION:キーの接頭辞として使用する文字。さきほどの動作確認でのキーを見ると、デフォルトの接頭辞が付いているのがわかる。auth文字列(空欄)コマンド早出前の認証キー。Redisでauthを使っている場合に使用する。database整数-1データベース番号を指定する。

在前面的README.markdown文档中关于PHP会话处理程序的部分中,已经写明了选项的指定方式(以下节选)。

session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"
广告
将在 10 秒后关闭
bannerAds