如何防止已启动的PHP会话写入?

时间:2011-09-09 21:40:15

标签: php session

我的情况是我开始了一个会话:

session_id( $consistent_session_name_for_user );
session_start();
$_SESSION['key'] = $value;

但后来我决定我实际上并不想“提交”(写)这个会话。 PHP似乎没有任何session_abort_write()函数。我不想从先前的脚本运行中销毁会话变量,所以我不能使用session_destroy()

我试过了session_id(""),但是这次通话失败了。我可以“重定向”会话,以便它写入另一个会话,如session_id("trash"),但这会导致很多PHP(Apache)连接尝试写入同一个会话“文件”,我想避免

我在这里高度简化了问题,我们实际上是在Memcached中存储会话,这是一个复杂的代码库。所以我不想一直向Memcached服务器发送不必要的“垃圾”会话。

4 个答案:

答案 0 :(得分:1)

来自PHP.net,
session_regenerate_id  将用新的会话ID替换当前的会话ID,并保持  当前会议信息。

session_unset将释放所有已注册的变量 session_unregister ( string $name )将取消注册特定变量

答案 1 :(得分:1)

我实际上并没有确定此方法是否阻止将会话写入会话存储,但这是我最终使用的解决方案:

session_id( 'trash' ); // or call session_regenerate_id() as someone else suggested
$_SESSION = array(); // clear the session variables for 'trash'.

我希望这会产生什么效果,但是我猜它还会写一个空白文件,因为PHP无法知道sess_trash还没有。

如果您想完全避免编写会话,则必须在PHP中使用自定义会话处理程序并设置全局标志以防止编写会话。

答案 2 :(得分:0)

session_write_close()。它将会话数组转储到存储,然后“关闭”它 - $ _SESSION仍然可用且可读/可写,但不会再保存任何更改,除非您稍后在脚本中再次执行session_start()

答案 3 :(得分:0)

您可以使用session_set_save_handler的内容将虚拟函数放入会话处理中。

<?php
function fakeIt() {
    return true;
}
session_set_save_handler("fakeIt", "fakeIt", "fakeIt", "fakeIt", "fakeIt", "fakeIt");