PHP会话 - 锁定和共享问题

时间:2010-05-29 20:39:32

标签: php session

我想知道是否可以在不锁定的情况下读取$ _SESSION属性 目前,session_start()锁定了SESSION,这意味着其他PHP进程将一直等到它被解锁 但是,有些进程只想获得一些$ _SESSION变量,而不是写入它们 是否可以实现某些功能,如session_get(string $id),它不会锁定SESSION?

此外,一旦用户登录同一帐户(例如,使用session_id('shared_vars_of_'.$userid)),就可以在浏览器之间共享SESSION。但是,那安全吗?这是否气馁?

谢谢,
努诺

2 个答案:

答案 0 :(得分:6)

我个人在开始时这样做:

session_start();
session_write_close();

然后您可以以只读方式访问$ _SESSION。如下所示,您无需复制会话变量

session_start();
//This value will be "The #1 Value!" only the 2nd time you run this
echo "<br />myData value1:".$_SESSION['myData'];
$_SESSION['myData'] = "Value 2 and 3!";
session_write_close();

echo "<br />myData value2 (read-only):".$_SESSION['myData'];
$_SESSION['myData'] = "Value 3 Misleading, and never actually written to the session!";
//But it will affect this value, obviously
echo "<br />myData value3:".$_SESSION['myData'];

session_start();
//NOTE HOW THE ABOVE LINE WRITES-OVER $_SESSION
echo "<br />myData value4:".$_SESSION['myData'];
$_SESSION['myData'] = "The #1 Value!";
session_write_close();

答案 1 :(得分:4)

有趣的问题!

session_write_close()并不完全符合您的要求,但它应该有助于加快这一过程:

  

会话数据通常在脚本终止后存储,无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以在会话上运行。将框架集与会话一起使用时,由于此锁定,您将体验到逐个加载的框架。只要对会话变量进行了所有更改,就可以通过结束会话来减少加载所有帧所需的时间。

只需要只读访问权限的脚本可以启动会话,将会话变量复制到另一个数组并应用session_write_close()。它不是一个完全只读的解决方案 - 可能是你需要为此构建自己的会话处理程序 - 但它应该是向前迈出的一大步。

更新:我刚刚发现interesting issue from 2001 in the PHP 4 tracker似乎引入了一个启用只读会话的​​补丁 - 但它似乎没有进入正式版本,但至少不是根据文件!也许值得深入挖掘或重新打开PHP 5的Ticket。