PHP会话 - 锁定和共享问题

Nun*_*uno 4 php session

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

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

谢谢,
努诺

Sna*_*nap 6

就个人而言,我在一开始就是这样做的:

session_start();
session_write_close();
Run Code Online (Sandbox Code Playgroud)

然后您可以以只读方式访问$ _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();
Run Code Online (Sandbox Code Playgroud)


Pek*_*ica 5

有趣的问题!

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

会话数据通常在脚本终止后存储,无需调用 session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以对会话进行操作。当将框架集与会话一起使用时,由于这种锁定,您将经历框架一一加载。您可以在会话变量的所有更改完成后立即结束会话,从而减少加载所有帧所需的时间。

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

更新:我刚刚在 PHP 4 跟踪器中发现了 2001 年的一个有趣问题,该问题似乎引入了一个启用只读会话的​​补丁 - 不过,它似乎没有进入正式版本,至少根据文档没有!也许值得进一步挖掘或重新打开 PHP 5 的票证。