会话允许一个基于Web的应用程序跨多个HTTP请求维护状态。 你可以注册任意数目的变量为会话变量,然后通常存储在服务器上的一个临时目录,或通过客户端浏览器通过Cookie。 后续请求保存的信息的访问和应用程序的状态是保存在多个请求。
PHP的默认的会话数据的处理可能是足以满足大多数应用,但有时一个项目会要求不同的存储方式。 幸运的是,会话处理程序可以被覆盖,可以通过一系列的功能在旧版本的PHP或一类处理各方面的会话管理的方法(或更新版本)。
在这篇文章中,我们将学习如何创建一个自定义的会话处理程序,实现PHP的SessionHandlerInterface
接口,Redis的数据库中存储会话数据。
为什么定制寄存?
你可能会奇怪,为什么有人可能希望(或需要)通过编写自定义处理程序的麻烦。 如果是这样,它可能是有利的,考虑下面的。
这是常见的,当应用程序驻留在服务器场中的每台主机来处理请求的负载均衡和冗余。 会话数据存储在临时文件只会是访问其特定主机。 由于服务器处理请求可能是不一样的处理先前的请求,以保证访问的状态信息是不可能的没有替代处理机制。 会话的数据可以存储到一个中央存储机制,集群中的所有机器。
一个共享的主机服务器,它很可能是所有临时会话文件存储在同一目录。 该目录及其内容的Web服务帐户,这有可能构成严重的安全风险下启动的任何进程访问。 谁可以访问别人的会话数据的恶意用户冒充合法用户的能力。
自定义会话处理,还提供了更大程度的灵活性。 因为你指定的存储和访问信息的新方法,你可以操纵的数据,任何你想要的方式,以满足您的需求。 也许你可能想保留的信息安全审计或故障排除。 钩扩大尺寸和功能方面的任何数目的方式中的应用程序,可以使用自定义处理。
会话管理操作
因为我们要管理我们自己的会话数据,而不是让PHP处理对我们来说,我们写的任何代码需要解决的六个会话管理任务。
在PHP 5.4之前的版本中,我们需要指定session_set_save_handler()
函数的参数上面的顺序(6个可调用一个函数或方法处理每个任务) 。 在5.4和更高版本中,我们可以创建一个类实现SessionHandlerInterface
接口,并通过一个实例来代替。 该接口公开六个相同签名的方法,作为将被用于在pre-5.4的方法的功能。
存储机制
您所选择的存储机制是出于您的需求。 这可能是任何远程的临时文件,MySQL数据库,LDAP服务器,共享内存段,在这篇文章中,我要说明存储会话数据在Redis的一个XML-RPC,IMAP服务收件箱,等。
PHP自动生成一个唯一标识符跟踪会话,并将其链接到一个特定的客户端。 因为这个令牌是唯一为每个会话标识符非常适合作为一个关键的使用(其实,这的令牌通常作为PHP默认的基于磁盘的处理方法中的文件名)。
会话数据也被自动序列化和反序列化的PHP。 即,接收的数据的方法,该方法用于存储传递已经序列化的数据,预期返回序列化的数据和检索数据的方法,该方法的。 的功能session_encode()
和session_decode()
也可以,如果因任何理由,我们需要他们,但一般我们可以简单地存储和检索会话数据提供。
当然,重要的是要清理过时会话不再需要。 例如,如果我们的会话数据存储在MySQL数据库中,例如,我们想要与每个记录都包含一个时间戳。 时间戳会被检查用我们的方法来覆盖垃圾收集行为。 但Redis的,我们可以利用其EXPIRE
命令。 EXPIRE
设置超时或TTL(生存时间)
的一个关键,关键是超时过期后自动删除。
我的代码!
我们现在知道什么功能SessionHandlerInterface
接口的承诺,我们有一个粗略的方法应该如何与Redis的互动,我们可以编写自己的代码。
本文为张子庭博客原创文章,转载无需和我联系,但请注明来自张子庭博客博客https://www.loyating.com
最新评论