【问题标题】:PHP Sessions - Locking and Sharing questionsPHP 会话 - 锁定和共享问题
【发布时间】:2010-05-29 20:39:32
【问题描述】:

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

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

谢谢,
努诺

【问题讨论】:

    标签: php session


    【解决方案1】:

    我个人一开始就这样做:

    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();
    

    【讨论】:

    • 这实际上引入了会话锁定旨在解决的所有并发问题:如果第二个请求尝试更改会话,而第一个请求以只读方式使用它(session_write_close 和 @ 之间的部分987654324@),只有第一个脚本的更改实际上会持续存在。这是因为它将使用更改的值(良好)以及脚本启动时加载的值(包括第二个脚本更改的键)写入整个会话。
    • 请注意,打开和关闭会话需要一些时间(特别是对于大型会话),并且会使您的脚本变慢。例如foreach (...) { process(); session_start(); write_progress(); session_write_close(); } 会很慢!
    • @RaphaelSchweikert session_start() 负责锁定并等待其他脚本执行 session_write_close()
    【解决方案2】:

    有趣的问题!

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

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

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

    更新:我刚刚发现了一个interesting issue from 2001 in the PHP 4 tracker,它似乎引入了一个启用只读会话的​​补丁——不过,它似乎并没有进入官方版本,至少不是按照到文档!也许值得进一步挖掘或重新打开 PHP 5 的票证。

    【讨论】:

    • 其实我知道这个功能,而且我已经用过了。因此,根据您的回答,我认为不可能有只读解决方案。谢谢佩卡。
    • @Nuno 不是我所看到的,不,如果没有将会话处理完全掌握在您自己手中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2013-05-25
    • 2014-06-17
    • 2023-04-02
    • 1970-01-01
    • 2011-12-20
    • 2014-07-10
    相关资源
    最近更新 更多