PHP7.4 关于 Redis 问题的会话存储



我将PHP版本从7.1升级到7.2,7.3,7.4。

升级后,我在 Redis 上遇到了会话存储问题。

我正在尝试使用

菲律宾比索 7.4

Php-redis 5.2.1

Yii 2.0.15

Nginx 1.14.0 (Ubuntu(

乌班图 18.04

在我的应用程序配置中, 我已经设定了

session_save_path("tcp://127.0.0.1:6379?auth=admin123&prefix=AT_R_");

当我尝试运行该应用程序时,出现以下错误:

[错误] 21728

#21728: *1081 FastCGI 在标准中发送:"PHP 消息: yii\base\InvalidArgumentException: 会话保存路径无效 目录:tcp://127.0.0.1:6379?auth=admin123&前缀=AT_R_ in/var/www/php-aertrip/vendor/yiisoft/yii2/web/Session.php:352

奇怪的是,与 Php 7.1相同的代码设置可以完美运行,但不适用于 7.2、7.3 和现在的 7.4。

我找不到任何理由让这不起作用。请建议此问题的可能原因。

任何帮助不胜感激。提前谢谢。

LE: 因此,实际上使用ini_set()也适用于应用程序的范围。

ini_set('session.save_handler','redis');
ini_set('session.save_path','tcp://127.0.0.1:6379?auth=admin123&prefix=AT_R_');

--

Ubuntu 18.04/PHP 7.4.9 在这里。 我刚刚将 PHP 设置为使用 Redis 作为会话处理程序运行。 就我而言,我只是采用了简单的方法来更改 php 中的 PHP 设置.ini

session.save_handler = redis
session.save_path = "tcp://10.0.0.1:6379?auth=secretpass123"

这里提到几点:

  • 密码(如果有(必须进行URL编码
  • 在php.ini文件中每次编辑后重新启动Apache/FPM服务

但是在您的情况下,您已经提到您只需要由 Redis 为特定应用程序处理的 PHP 会话。所以我很好奇这是否可以实现。 为此,我使用了默认的 php.ini 设置和session.save_handler = files和注释掉session.save_path。 因此,为了实现这一点,应该使用session_set_save_handler功能 https://www.php.net/manual/en/function.session-set-save-handler.php

session_set_save_handler(( 设置用户级会话存储函数,用于存储和检索与会话关联的数据。当首选 PHP 会话提供的存储方法以外的存储方法时,例如将会话数据存储在本地数据库中,这最有用。

我还使用本指南来得出一个完整的工作示例(显然这不应该在生产中使用(https://developpaper.com/how-to-use-redis-to-save-user-session-details/

<?php
class SessionManager
{
private $redis;
private $sessionSavePath;
private $sessionName;
private $session_expiretime = 60;
public function __construct()
{
$this->redis = new Redis();// Create phpredis instance
$this->redis->connect('10.0.0.1', 6379); // connect redis
$this->redis->auth("secretpass123"); // authorization
session_set_save_handler(
array($this, "open"),
array($this, "close"),
array($this, "read"),
array($this, "write"),
array($this, "destroy"),
array($this, "gc")
);
if (!isset($_SESSION)) session_start();
}
public function open($path, $name)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
$value = $this->redis->get($id); // Get the specified record in redis
if ($value) {
return $value;
} else {
return '';
}
}
public function write($id, $data)
{
if ($this->redis->set($id, $data)) {
// stored with session ID as the key
$this->redis->expire($id, $this->session_expiretime); // Set the expiration time of data in redis, that is, session expiration time
return true;
}
return false;
}
public function destroy($id)
{
if ($this->redis->delete($id)) {// delete the specified record in redis
return true;
}
return false;
}
public function gc($maxlifetime)
{
return true;
}
public function __destruct()
{
session_write_close();
}
}

$handler = new SessionManager();
if (isset($_SESSION['test'])) {
echo ++$_SESSION['test'];
} else {
$_SESSION['test'] = 0;
echo 'not set - 0';
}

实例化 SessionManager 类会将会话处理程序设置为 Redis。这带有一个小测试,在连续页面重新加载时将创建并增加一个计数器。 您可以连接到 redis 服务器并运行 flushall 命令并观察计数器如何重置。

值得一提的是启用 php-redis 扩展。

$ php -m | grep redis 

应显示"redis"。 如果没有,可以像这样安装(在 Ubuntu 中(:

sudo apt-get install php-redis

最新更新