【问题标题】:Using of Session Database on multiple Apache Servers在多个 Apache 服务器上使用会话数据库
【发布时间】:2013-04-16 14:43:57
【问题描述】:

我一直在开发一个 webApp,它应该只能通过使用 AJAX 来执行任务。它似乎工作得很好,但我遇到了一个问题,因为我没有在公共站点上存储 Session 变量。

我的登录过程与 iCloud 的类似。您到达一个要求登录的页面。您的登录信息使用 AJAX 发送到服务器并返回 truefalse。如果为真,登录框会消失,您就可以开始使用应用程序了。

当您查看上图时,您会看到两个绿色框是完全相同的站点,没有任何 URL 刷新或任何东西。就是同一个页面。

粉红色框表示尚未注册任何Sessions 的Apache 服务器。我的 Session Class 是使用session_set_save_handler 理念构建的。

session_set_save_handler(
         array($this, 'open'),
         array($this, 'close'),
         array($this, 'read'),
         array($this, 'write'),
         array($this, 'destroy'),
         array($this, 'gc')
     );

我似乎无法找到一种方法让公共站点在没有会话 ID 的情况下请求 pink 服务器上的数据。谁能告诉我session_set_save_handler 想法背后的想法,就像我 6 岁一样?我已经阅读了 PHP 手册以了解详细信息,但它确实让我感到困惑。

如果有人知道这种通信方法如何正常工作,请告诉我。所有的 Apache 服务器都通过 LAN 网络连接,并且能够通信。此外,他们都可以访问 Apache 包含库中的相同 Session Class

【问题讨论】:

  • 我建议序列化/反序列化$_SESSION并将其存储在Sessions表中。
  • 但是 Apache 服务器如何知道在请求期间要处理哪个 Session?
  • 如果我没有误读:您将新会话保存到一个表中 - 在一个中心位置 - 每个 apache 服务器都可以从那里读取它?
  • 完全正确。我的困惑是 apache 服务器应该如何知道它应该处理哪些会话
  • @PhilipJensBramsted 是的。 (HTTP_ONLY 是一种防止 Javascript 直接读取的保护,但不适用于 ajax(它将自动发送))

标签: php database apache class session


【解决方案1】:

看来您遇到的问题可以使用分布式会话来解决。

使用 memcached,您可以为任何连接的服务器可以共享的所有会话数据提供一个中心点。

如果您使用的是 linux,下面的代码演示了如何注释掉本地文件会话处理,并将其替换为 memcache 可以让您共享会话数据。

  ~$ cat /etc/php5/apache2/php.ini | grep -i session 
  [Session] 
  ;session.save_handler = files 
  session.save_handler = memcache 
  session.save_path = "tcp://127.0.0.1:11211"

如需深入解释,请访问:http://bakery.cakephp.org/articles/rynop/2010/09/10/using-memcached-to-run-your-sessions

【讨论】:

  • 你知道.. 已经有一段时间了,实际上我在发布这个问题几周后找到了相同的解决方案,但我必须给你 +1 和正确的答案:),谢谢队友。
猜你喜欢
  • 2011-09-23
  • 2013-10-31
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2016-07-16
相关资源
最近更新 更多