我想在我的托pipe环境中设置mysql会话,为我的负载平衡环境中的所有客户端工作。 一些谷歌search后,这听起来像大多数人的解决scheme涉及覆盖他们的会议处理程序与PHP代码。 由于我不是我托pipe的所有网站的networkingpipe理员,我宁愿不要触摸PHP代码本身。
有没有办法通过Apache或PHPconfiguration添加PHP代码,所有页面处理? 还是有一个首选的mysql会话处理程序,人们使用? 我发现的唯一的一个是http://websupport.sk/~stanojr/projects/session_mysql/这似乎有点less,logging和支持比我想生产环境。
谢谢
在你的问题中不太清楚,但是我打算假设你正在问如何处理(负载平衡)服务器集群中的PHP会话。
传统的PHP会话存储在平面文件中 – 位置和详细信息在php.ini中configuration。 这个和服务器群集的问题当然是在一台服务器上创build的会话文件在任何其他服务器上都不可用。
这个问题有很多解决scheme,各有各的优缺点。
粘性会话:
让负载均衡器散列请求的IP,并始终将同一用户发送到同一台服务器。 这可以用于处理会话,但是它不能很好地扩展,不能很好地处理失败的节点,并且不允许更有效的(即,基于负载的)负载平衡。
群集文件系统:
通过使用分布式文件系统,您可以跨多个节点复制会话,并且每个节点都可以平等地访问会话。 典型的双节点设置可能包括DRBD和OCFS2–但是在设置心跳和故障切换时遇到一些困难。 一个更有弹性的系统可能会使用GlusterFS,但会增加相当大的开销。 这两种方法都可能遇到一些文件locking的问题,虽然GlusterFS应该可以工作得很好(它支持flock())。
RDBMS:
正如你所提到的,可以将会话存储在MySQL(和PgSQL)中。 数据库往往已经安装,并可用于多个节点,并支持lockingprimefaces事务。 但是,关系型数据库的function集对于存储平面文件并不是必须的,而且可能会增加一些不必要的开销。 (PHP用于绑定msession扩展,我相信,它不再被保留)。
NoSQL的:
最近的键值存储非常适合存储PHP会话。 以前,locking和身份validation可能有一些困难,但我相信大部分都已经解决了。 这一类的例子可能包括MongoDB和CouchDB。
易挥发的存储:
一些内存caching已经很好的build立了,并且在分布式系统(如Memcached,Redis)中普遍使用。 这些键值存储提供了会话pipe理所需的大部分function,特别是memcached非常容易设置为会话存储。 但是,这些方法往往有两个主要缺点:a)如果存储会话的服务器出现故障或需要重新启动,会话数据将丢失,因为存储在内存中; b)随着会话数据增长,内存使用量将增长,这可能会导致从caching中删除旧对象。
build议的解决scheme:
大多数优秀的解决scheme将caching与某些持久性存储结合起来,以避免数据库负载过大,但是可以防止数据丢失。 不幸的是,这些解决scheme通常需要修改PHP代码以包含自定义的session_save_handler。
一个很好的解决scheme,不需要修改PHP代码是MemBase 。 它运行在与memcached相同的协议上 – 使其可以轻松configuration为用作会话处理程序,但也提供持久性。
基本上,安装需要:
这个方法应该可以很好地扩展,你可以控制内存使用量,数据是持久的,性能好,开销小,安装简单,并且不需要修改任何PHP代码(只是改变一些PHP .ini设置)。
对于任何对此感兴趣的人,PHP看起来都有一个可以通过名为auto_prepend_file的ini文件来设置的设置。 这可以用来创build一个会话处理脚本,将运行所有的网站,而无需对网站代码本身进行任何修改。