我想在我的托管环境中设置 mysql 会话,以便为我的所有客户端提供全面的负载平衡环境。经过一番谷歌搜索,听起来大多数人的解决方案都涉及使用 php 代码覆盖他们的会话处理程序。由于我不是我托管的所有网站的网络管理员,我宁愿不接触 PHP 代码本身。
有没有办法通过 Apache 或 PHP 配置添加用于所有页面处理的 PHP 代码?或者是否有人们使用的首选 mysql 会话处理程序?我找到的唯一一个是http://websupport.sk/~stanojr/projects/session_mysql/ 与我希望的生产环境相比,它的文档记录和支持似乎有些不足。
谢谢
答案1
您的问题不太清楚,但我假设您问的是如何在(负载平衡)服务器集群中处理 PHP 会话。
传统的 PHP 会话存储在平面文件中 - 其位置和详细信息在 php.ini 中配置。当然,这和服务器集群的问题在于,在一台服务器上创建的会话文件在任何其他服务器上都不可用。
这个问题有很多解决方案,每个都有各自的优点和缺点。
粘性会话:
让负载均衡器对请求 IP 进行哈希处理,并始终将同一用户发送到同一服务器。这可能适用于处理会话,但其扩展性较差,不能很好地处理故障节点,并且无法实现更高效(即基于负载)的负载平衡。
集群文件系统:
通过使用分布式文件系统,您可以在多个节点之间复制会话,并且每个节点都可以平等地访问会话。典型的双节点设置可能包括 DRBD 和 OCFS2 - 但您在设置心跳和故障转移时确实会遇到一些困难。更具弹性的系统可能会使用 GlusterFS,但这会增加相当大的开销。这两种方法都可能遇到文件锁定的一些问题,尽管 GlusterFS 应该可以很好地工作(它支持 flock())。
关系型数据库(RDBM):
正如您所提到的,可以将会话存储在 MySQL(和 PgSQL)中。数据库往往已经安装,可供多个节点使用,并支持原子事务锁定。但是,关系数据库的功能集对于存储平面文件来说并不是真正必要的,并且可能会增加一些不必要的开销。(PHP 曾经捆绑了 msession 扩展,我相信它不再维护了)。
NoSQL:
最近的键值存储非常适合存储 PHP 会话。以前,锁定和身份验证方面可能存在一些困难,但我相信大多数问题都已得到解决。此类别的示例可能包括 MongoDB 和 CouchDB。
易失性存储:
一些内存缓存已建立并广泛用于分布式系统(例如 Memcached、Redis)。这些键值存储提供了会话管理所需的大部分功能,尤其是 memcached 非常容易设置为会话存储。然而,这些缓存往往有两个主要缺点 - a) 如果存储会话的服务器发生故障或需要重新启动,会话数据就会丢失,因为它存储在内存中;b) 随着会话数据的增长,内存使用量也会增长,这可能导致旧对象从缓存中删除。
建议的解决方案:
大多数好的解决方案都会将缓存与一些持久存储相结合 - 以避免数据库负载过大,但又能防止数据丢失。不幸的是,这些解决方案通常需要修改 PHP 代码以包含自定义 session_save_handler。
不过,有一个很好的解决方案,不需要修改 PHP 代码,那就是记忆库。它运行在与 memcached 相同的协议上 - 使其易于配置为会话处理程序,同时还提供持久性。
本质上,设置包括:
- 下载并安装 MemBase 应用程序(.deb 和 .rpm 格式的二进制文件)
- 配置服务器(它有一个 Web 界面——不是理想的,但它能完成工作)
- 安装 php5-memcached 扩展(但不要安装 memcached,因为它与 MemBase 冲突)
- 更改 php.ini 中的 session.save_handler 和 session.save_path 以指向 MemBase 服务器
- 重新启动 Web 服务器、php-fpm 等。(快速搜索会发现本指南,这似乎是合理的)
该方法应该具有相当好的可扩展性,您可以控制所使用的内存量,数据是持久的,性能良好且开销最小,设置简单,并且不需要更改任何 PHP 代码(只需更改一些 php.ini 设置)。
答案2
对于对此感兴趣的其他人,PHP 似乎有一个可以通过 ini 文件设置的设置,名为 auto_prepend_file。这可用于创建一个会话处理脚本,该脚本将在所有网站上运行,而无需对网站代码本身进行任何修改。