【问题标题】:PHP session locking and using Memcache to store sessionsPHP 会话锁定和使用 Memcache 存储会话
【发布时间】:2014-01-29 10:38:29
【问题描述】:

我有一个标准的 html 页面,它有几个 img 标签,每个标签都指向我们服务器上的一个 php 文件。当 php 文件被加载时,它会在生成图像之前将一些数据保存到会话中。

每个脚本的会话中的这些数据随后会在我们应用程序的其他脚本中进一步使用。

生成图像的 php 文件以 session_start 开头,当使用原生 PHP 会话处理程序时,一切似乎都很好。每次执行都正确完成,并且可以检索完整的会话数据。

如果我启用 memcache 来保存会话,那么问题就会开始出现。看起来每个 PHP 脚本都是同时执行的,因此当保存到会话时,只有最后一个执行的脚本实际上存储了任何数据。

进一步调查Memcache后发现最新的稳定版不支持会话锁定,只有在3.0.4才引入这个-http://pecl.php.net/package/memcache/3.0.4

3.0.4 仅处于测试阶段时使用它是否安全?

在 2.2.7 中是否有任何替代方案或解决此问题的方法?

【问题讨论】:

    标签: php session memcached sessionid


    【解决方案1】:

    php-memcached 扩展支持会话锁定

    http://us3.php.net/memcached

    http://us1.php.net/manual/en/memcached.sessions.php

    memcache 和 memcached 扩展在语法上看起来很相似,因此尝试一下可能不会太让人头疼。 (memcached 有一个稳定的版本 2.1.0 发布于 2012-08-07)。


    如果您设置为使用 memcache 2.2.7,您很可能必须自己实现锁定,方法是在会话中设置一些“session_is_locked”变量,然后在脚本完成写入会话时释放/取消设置它。然后,在继续写入会话的任何脚本之前,您总是需要检查是否设置了该变量。

    【讨论】:

    • php.ini memcached 设置(包括 sess.locking)在这里 -> php.net/manual/en/memcached.configuration.php。我没有说明 beta 版本是否“安全”,因为我没有足够的经验使用 memcache 扩展来为您提供足够的答案。虽然 id 假设查看 pecl 页面上的包错误可能有助于您做出决定。
    • Memcached 似乎已经成功了,现在似乎按预期工作,并且根本没有太多的麻烦来改变。谢谢!
    猜你喜欢
    • 2011-04-22
    • 2015-02-28
    • 2012-12-06
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多