PHP会话处理-无效值

PHP会话处理-无效值,php,validation,session,Php,Validation,Session,我们需要在许多现有代码中使用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_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不会像预期的那样将会话写入MemcacheD会话处理程序,但它仍然在同一脚本运行时内使用覆盖

输出:“伪会话数据:之后”

第二轮:

输出:“会话数据:之前伪会话数据:之后

问题是:如何确保PHP没有使用伪会话变量,而这些变量实际上没有写入会话?这里有办法获取PHP警告吗?或者有什么建议来处理这个问题


为什么我们需要在所有地方添加write close:将“PHP5.x”更新为“PHP7”后,一切都变慢了。特别是在AJAX请求或同时加载多个选项卡时。这是因为PHP7似乎改变了它的会话处理/阻塞

非常好的演示:


因此,我们需要在大量脚本附近添加会话写入,而不冒会话值无效的风险。

您可以查看
会话状态()的输出。
()


您可以使用包装器函数来获取/设置会话变量。

您可以查看
会话状态()的输出。
()


您可以使用包装器函数来获取/设置会话变量。

而不是
session\u write\u close()编写自己的函数并取消设置superglobal:

function session_stop() {
    session_write_close();
    unset($_SESSION);
}
现在您将获得:

注意:未定义的变量:\文件X行Y中的会话


而不是
session\u write\u close()编写自己的函数并取消设置superglobal:

function session_stop() {
    session_write_close();
    unset($_SESSION);
}
现在您将获得:

注意:未定义的变量:\文件X行Y中的会话


因此,请使用带有乐观锁定的非阻塞处理程序。了解更多信息吗?这里包含一个非阻塞处理程序(在一个框架中,您可以使用该框架添加存储基板,并将乐观锁定作为绝望的关注点)因此,请使用带有乐观锁定的非阻塞处理程序。了解更多信息吗?这里包含一个非阻塞处理程序(在一个框架中,您可以使用该框架添加存储基板,乐观锁定是令人绝望的问题),谢谢您的评论。每次在写入会话之前检查会话\ u状态似乎很费劲。我想知道PHP是否对此进行了任何全局错误处理。谢谢您的评论。每次在写入会话之前检查会话\ u状态似乎很费劲。我想知道PHP是否对此进行了全局错误处理。您也将无法再读取会话数据,不是吗?您也将无法再读取会话数据,不是吗?