【问题标题】:Issues with session write/read since changing from server sessions to redis sessions从服务器会话更改为 redis 会话后的会话写入/读取问题
【发布时间】:2022-02-05 21:28:51
【问题描述】:

自从我们从常规服务器会话切换到存储在 Redis 中的会话后,我们的 PHP 应用程序出现了一些奇怪的行为。

PHP 代码没有改变,但是我们在编写一个在同一函数链中读取的会话变量时注意到了一个问题。

我将尝试用伪代码举例说明代码:

  //some code
...
  session_start();
  //now we write the session variable
  $_SESSION[key] = value;
  session_close();
...
  //some other code
  
  return getSomeSpecificValue();
}

function getSomeSpecificValue(){
  //some code
  ...
  session_start();
  $someVar = $_SESSION[key];
  session_close();
  ...
  //some code
  
}

现在的问题是,自从迁移到 redis 会话后,即使我们刚刚写了它,读取它时变量也是空的。

这种行为在迁移到 Redis 之前并未发生。我们是否缺少特定的比赛条件或设置?还是我们现在需要更改代码?

如果有人可以帮助我们提供有关在哪里查看的指示,那将不胜感激。如果您需要更多信息,请告诉我,我们一直在调试此问题,但似乎找不到解决方案。比赛条件?数据锁? ..

刷新页面时,该值不再为空,因此我们非常确定它已写入 redis,可能是在第一次尝试时 (?) :-)。

【问题讨论】:

  • 这可能是一种竞争条件,即会话在您打开并尝试再次阅读之前没有时间编写它。您可以测试每个请求仅启动一次,并且根本不调用 close(并且只有在发现任何问题时才将其更改回来)。否则,您可以测试将 session_close() 更改为 session_write_close() 并查看是否有任何不同。请记住,任何session_start() 必须在任何类型的输出之前调用。

标签: php session amazon-ec2 redis


【解决方案1】:

您必须添加Redis Extension on the Web Server 例如php5

sudo apt-get install php5-redis

然后在 Web 服务器中添加会话处理程序,例如

在 LAMP 环境中:

sudo vim /etc/php5/apache2/php.ini

在 LEMP 环境中:

sudo vim /etc/php5/fpm/php.ini

添加这行

[label /etc/php5/fpm/php.ini] 
session.save_handler = redis

然后重启网络服务器。

我没有测试解决方案,但应该可以。我从这篇文章 https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server-as-a-session-handler-for-php-on-ubuntu-14-04https://www.cloudways.com/blog/setup-redis-as-session-handler-php/https://bestofphp.com/repo/1ma-RedisSessionHandler-php-miscellaneous 中编译了这个答案。

【讨论】:

  • 据我了解他们的问题,他们已经转移到 redis 进行会话(这意味着他们应该已经完成​​了上述操作),现在正在询问一个具体问题;在页面重新加载之前,它们存储的会话数据无法在同一脚本中读取。
  • @M.Eriksson 是正确的,我们想知道为什么会话数据在设置后无法立即读取。这适用于服务器会话,而不适用于我们的 redis 会话。
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 2014-04-15
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2013-02-04
相关资源
最近更新 更多