我有一个论坛,用户不到40万。张贴的时区设置为中央标准时间。我可能会在数据库中保存与GMT相关的时区偏移量,如+3、-8等。我想知道的是:我应该使用操作代码缓存(如APC或xcache)或基于文件系统的缓存来缓存这些偏移量吗?我的目标是避免连续调用每个人时区的数据库。
我之前多次遇到这个问题,近期内,我会将它们存储在$_SESSION
var中,大概是在登录时,您会调用DB进行身份验证。例如,在身份验证成功时,设置:
$_SESSION['timezone'] = '3'; // +3 hours from GMT
这样,它就可以在整个会话中使用,而不必对数据库进行一次调用,并在需要的地方使用它
如果你需要覆盖它,你可以:
$_SESSION['timezone'] = '-5'; // -5 hours from GMT
或者在任何时候取消设置:
unset($_SESSION['timezone']);
虽然您有40万用户,但我们不知道您的设置/网络/并发用户峰值或平均负载,因此很难说您是否需要考虑分布式对象缓存或其他方法,如下所述。
背景
为什么要使用会话
使用PHP$_SESSION
可以存储大量信息,而不是偶尔或频繁地从数据库中请求数据。您也可以在会话中存储大量数据,但常识表明,您应该尽可能少地存储所需的数据。这是因为:
在PHP中,默认情况下,会话存储在磁盘上(在/tmp目录中),在您开始看到性能下降之前,这将扩展到一定程度——这取决于您的平台的设计方式。
操作码缓存/加速器怎么样
eAccelerator、APC和其他(你可以在这里找到PHP操作码缓存引擎的列表)不会(除了一两个具有特定功能的)改善这些变量(从DB)的调用/返回,因为PHP是一种解释语言。
这意味着每次请求PHP生成的页面时,服务器都必须读入所需的各种文件;编译";它们转换成机器在运行时可以理解的东西(操作码)。
PHP操作码缓存机制/引擎将生成的代码保存在缓存中,因此只需一次生成即可为数百或数百万个后续请求提供服务,因此,安装操作码缓存将减少生成页面所需的时间(有时高达90%)。
使用PHP操作码缓存可能是个好主意,但不要减少对数据库的连续调用。。。这不是他们的核心目的。
更大、更活跃/高负载的站点如何
由于用户的一致性,具有更多流量和更高负载的较大站点通常使用基于内存的解决方案来存储频繁使用的和面向用户的关键数据(包括时区!)-更具体地说基于内存的DB表";或">分布式内存对象缓存";,其可以分布在一个或多个服务器之间以平衡负载。。。
MySQL有内存/堆表(在内存中而不是在磁盘上创建),但仍然需要SQL查询来返回数据/信息。不用说,它们比访问存储在磁盘上的数据快得多。
PHP领域中最流行的基于内存的缓存解决方案可能是memcached,它被许多公司/项目广泛使用,并被描述为:
一个高性能、分布式内存对象缓存系统,本质上是通用的,但最初旨在通过减轻数据库负载来加速动态web应用程序。。。memcached允许您从系统中内存不足的部分获取内存,并使其能够访问到内存不足的区域。
从长远来看(随着显著增长),这种方法是可取的。,但是,在不了解平台的负载和夹点/瓶颈的情况下,我建议默认使用PHP$_SESSION
并从那里开始工作。