【发布时间】:2019-02-19 17:21:15
【问题描述】:
我们需要在很多现有代码中使用 session_write_close()。但这对我们来说看起来很危险,因为 PHP 会执行以下操作 - 没有给出任何警告或错误:
session_name('goodoldasdf');
session_start();
if (!empty($_SESSION['var'])) {
print ' Session-Data: '. $_SESSION['var'];
}
$_SESSION['var'] = "before";
session_write_close();
$_SESSION['var'] = "after"; // notice: definition after write close!
print ' B: '. $_SESSION['var'];
当我们在 session_write_close 之后定义一个 SESSION-var 时,PHP 不会将 SESSION 写入 MemcacheD 会话处理程序(如预期的那样) - 但它仍然在同一脚本运行时使用覆盖。
输出:“伪会话数据:之后”。
第二次运行:
输出:“会话数据:之前伪会话数据:之后”
问题是:如何确保 PHP 没有使用 pseudo SESSION-vars,实际上并没有写入会话中? 有没有办法在这里得到 PHP 警告?或者有什么解决这个问题的建议?
为什么我们需要到处添加 write close: 将“PHP 5.x”更新为“PHP 7”后,一切都变慢了。特别是在 AJAX 请求或同时加载多选项卡上。这是因为 PHP 7 似乎改变了它的会话处理/阻塞。
很好的演示:https://demo.ma.ttias.be/demo-php-blocking-sessions/
所以我们需要将 session_write_close 添加到很多脚本中 - 不会冒无效会话值的风险。
【问题讨论】:
-
所以使用带有乐观锁定的非阻塞处理程序。
-
了解更多相关信息吗?
-
这里包含一个非阻塞处理程序(在一个框架中,您可以使用它来添加存储基板和乐观锁定作为绝望的关注点)phpclasses.org/package/…
标签: php validation session