【发布时间】: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