不言不语

您现在的位置是: 首页 >  数据库  >  MYSQL

MYSQL

在PHP项目中,用Redis保存session

2022-05-31MYSQL
在PHP项目中,session的默认保存是file(文件),当用户量大的时候,文件读取会比较慢,而用Redis保存session可以大大提高session的使用效率

PHP默认是支持用Redis来保存session的, 不需要什么其他的扩展类库或代码来实现, 只需要更改php.ini中的配置。

Redis保存session使用的命令是setex,用redis-cli monitor实时监测可以检测到。


Redis保存session使用 setex命令 的语法:


# key是键值,time是过期时间,value是字符串类型的值
setex(key, time, value)


一、Redis环境


1、请确保安装了Reids环境,并配置到PHP项目中

2、php安装了php redis扩展,可以通过函数phpinfo()能够看到redis扩展,如下图:

Redis保存PHP Session方法.png

3、测试PHP是否能正常访问redis, 刷新页面,如果看到数字不断增加,说明Redis环境正常,测试代码如下:

<?php

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $count = $redis->exists('count') ? $redis->get('count') : 1;
    echo $count;
    $redis->set('count', ++$count);


二、配置PHP


安装了Redis扩展后,phpinfo()输出中会看到session的支持句柄,其中包含了redis,如下:

session_redis.png

有一点要注意的是,Redis的过期时间最大值为2147483647,也就是十六进制的7fffffff。所以,session配置中回收时间session.gc_maxlifetime的值不能超过这个数字。否则Redis用setex命令保存session时,过期时间time为负数,相当于直接删除了这个key。这样不仅不会保存成功,PHP还会返回下面的错误:

 Warning: Unknown: Failed to write session data (redis). Please verify that the current setting of session.save_path is correct (127.0.0.1:6379) in Unknown on line 0


1、修改php.ini

打开 php.ini 文件,设置下面两个值:

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

如果Redis有密码,用下面的配置:

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=password"

配置完成后,重启php-fpm。


2、修改php-fpm.conf

PHP-FPM的配置文件/etc/php-fpm.conf或者/etc/php-fpm.d/*.conf中,也有session的配置。

它们的session配置优先级比php.ini高,会覆盖php.ini中的配置。

所以,也直接在这里面改:

php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"

配置完成后,重启php-fpm。


3、PHP代码配置

也可以在运行的PHP代码中配置session,如下:

<?php

ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');


三、最后,进行在PHP项目中,用Redis保存session测试,测试代码:

<?php

// 如果刷新页面看到数字不断增加,则说明配置Redis保存session成功。

session_start();
$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;

echo $count;

$_SESSION['count'] = ++$count;

文章评论