Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止已启动的PHP会话写入?_Php_Session - Fatal编程技术网

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

如何防止已启动的PHP会话写入?,php,session,Php,Session,我的情况是,我已经开始与以下人员进行对话: session_id( $consistent_session_name_for_user ); session_start(); $_SESSION['key'] = $value; 但是后来我决定我实际上不想“提交”(写)这个会话。PHP似乎没有任何类型的session\u abort\u write()函数。我不想销毁以前脚本运行中的会话变量,因此不能使用session\u destroy() 我尝试了会话id(“”,但调用失败。我可以“重定向

我的情况是,我已经开始与以下人员进行对话:

session_id( $consistent_session_name_for_user );
session_start();
$_SESSION['key'] = $value;
但是后来我决定我实际上不想“提交”(写)这个会话。PHP似乎没有任何类型的
session\u abort\u write()
函数。我不想销毁以前脚本运行中的会话变量,因此不能使用
session\u destroy()

我尝试了会话id(“”,但调用失败。我可以“重定向”会话,使其写入另一个会话,如
session\u id(“垃圾”)
,但这会导致许多PHP(Apache)连接尝试写入同一个会话“文件”,我希望避免这种情况

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

来自PHP.net,
将用新会话id替换当前会话id,并保留 当前会话信息

将释放所有已注册的变量

将注销特定变量存在
会话\u write\u close()
。它将会话数组转储到存储器中,然后“关闭”它-$\u会话仍然可用并可读/写,但任何更改都将不再保存,除非您稍后在脚本中再次执行
会话启动()

您可能可以使用某种方法将虚拟函数放入会话处理中

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

我还没有确定此方法是否会阻止将会话写入会话存储,但我最终使用了以下解决方案:

session_id( 'trash' ); // or call session_regenerate_id() as someone else suggested
$_SESSION = array(); // clear the session variables for 'trash'.
我希望这样做的效果是什么都不会被写入,但我猜它仍然会写入一个空白文件,因为PHP不知道sess_垃圾还没有出现


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

好主意,但不幸的是,对$\u会话已经进行了一些更改,我希望将其“丢弃”,然后在进行这些一次性更改之前关闭写入。它可以在初始会话\u开始调用后的任何时间完成。我不能-我不知道是否需要丢弃会话数据,直到那些$\u会话属性更改后很久。如果可能的话,我也希望避免写入会话,因为它会通过网络发送死数据(到“垃圾”会话)。PHP仅在脚本退出或执行会话写入关闭()时将会话转储到存储器。如果您有“垃圾”数据,则始终可以在脚本关闭时将其从$\u会话中取消设置,这将阻止它通过memcache服务器发送。将某些内容写入$\u会话不会立即将其发送到memcache。在脚本运行时,它只是一个数组变量,与其他任何变量一样,只是碰巧会自动为您保留。即使我知道更改了哪些数据,以便可以恢复或取消设置(我不知道),我想要的解决方案也不会将数据写回会话存储区。谢谢,但我不想取消设置或取消注册现有会话变量
session\u regenerate\u id
做的事情与我建议的
session\u id(“垃圾”)
做的事情相同,但我希望避免完全编写会话数组。这是一个好主意,我尝试过。不幸的是,您必须在会话开始之前调用会话设置保存处理程序
,否则无效。在会话启动之前,我不知道是否要抛出会话。您可能需要为memcached会话写入编写一个包装器方法,以检查“垃圾”标志。是的,可能,唯一的问题是我们使用本机memcached会话保存处理程序,我想知道是否可以只包装“写入”方法,同时继续对其他方法使用本机处理程序。