【问题标题】:Sessions in PHP5 - built-in sessions or not?PHP5 中的会话 - 是否内置会话?
【发布时间】:2011-02-10 09:30:12
【问题描述】:

背景:
我正处于基于 PHP5.3 构建的新项目的起步阶段。我刚刚开始研究以最初允许我将会话保存到数据库的方式处理会话的方法。我会将所有会话管理分离到一个单独的库中,以便轻松透明地迁移到 memcached单独的会话数据库服务器,或者到那时最好的解决方案。

不过,我对什么是好方法感到有些困惑——网上有很多关于如何处理因 PHP 版本而异的会话的不同想法,而且我读的越多,我就越困惑。

问题:
以下是我认为最合适的选项。我应该使用哪一个,为什么?是否应考虑其他替代方案?

选项 1:
使用session_set_save_handler 并为每个会话事件创建自定义函数,以充分利用 PHP 的本机(内置)会话处理,但仍将会话保存到数据库。会话会写成$_SESSION['identifier'] = 'value';

选项 2:
构建一个完整的会话类,它与 PHP 的会话无关,只是充当与我的数据库中的 sessions 表对话的任何数据库模型。会话会写成$this->sessions->write('identifier', 'value');

【问题讨论】:

    标签: php session


    【解决方案1】:

    $_SESSION 超全局实际上是 PHP 中一个非常好的特性。

    根据您的软件解决方案的最终结果,第三方用户会更习惯于使用您的自定义会话处理程序在后台执行魔术来写入和读取这个超全局。

    Suhosin 还提供了很好的安全增强功能,您在为自己开发会话存储时无需“担心”。

    【讨论】:

      【解决方案2】:

      我建议你走后一条路,但要转个弯。

      创建一个Session 类,然后使用适配器模式通过DatabaseSessionCookieSession 具体类对其进行扩展。

      在我看来,覆盖 session_save_handler 似乎太过分了。

      随着项目变得越来越大,通过包装类路由所有与会话相关的交互为您提供了更大的灵活性。

      类似这样的:

      interface SessionAdaptor {
         function write($key, $data, $timeout);
         function read($key);
         function key_exists($key);
      }
      
      class Session {
        private $adaptor;
      
        function __construct(SessionAdaptor $adaptor) {
           $this->adaptor = $adaptor;
        }
      
        //here we go:
      
        function write($key, $data, $timeout) {
           return $this->adaptor->write($key, $data, $timeout);
        }
      
        function read($key) {
           return $this->adaptor->read($key);
        }
      
        function key_exists($key) {
           return $this->adaptor->key_exists($key);
        }
      }
      
      class DatabaseSession implements SessionAdaptor {
         //...
      }
      
      class CookieSession implements SessionAdaptor {
         //...
      }
      

      用法:

      $database_session = new Session(new DatabaseSession());
      

      【讨论】:

      • 在您看来单独调用“head”Session 类是否会存储到 PHP 会话?
      • @Industrial 不,它只是一个抽象超类。
      • re session_save_handler:我不会称其为 hack - 这不正是它应该用于的吗? uk.php.net/manual/en/function.session-set-save-handler.php
      • 你好,雅各布。这不会影响我之前想要的“透明度”,因为我需要在我的代码中调用 DatabaseSession 类,最终改变未来存储会话的另一种方式不透明?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2013-08-26
      • 2012-08-09
      相关资源
      最近更新 更多