如何处理用户特定的时区?

时间:2012-11-17 03:38:08

标签: php caching timezone

我的论坛用户不到40万。帖子的时区设置为中央标准时间。我可能会在数据库中保存时区偏移量,比如+ 3,-8等,与GMT相关。我想知道的是:我应该使用像APC或xcache或基于文件系统的缓存的操作码缓存来缓存它们吗?我的目标是避免为每个人的时区连续调用数据库。

1 个答案:

答案 0 :(得分:1)

在此之前,短期内多次遇到此问题,我会将它们存储在$_SESSION var中,大概是在登录时,您将调用数据库进行身份验证。例如,在身份验证成功时,请设置:

$_SESSION['timezone'] = '3'; // +3 hours from GMT

这样,它可以在整个会话期间使用,而无需对数据库进行单次调用并在需要的地方使用它。

如果您需要覆盖它,您可以:

$_SESSION['timezone'] = '-5'; // -5 hours from GMT

或者在任何时候取消它:

unset($_SESSION['timezone']);

虽然您有400K用户,但我们不知道您的设置/网络/并发用户峰值或平均负载,因此很难说您是否需要查看分布式对象缓存或其他方法,如下所述

背景

为什么要使用会话?

使用PHP $_SESSION使您可以存储大量信息,而不是偶尔或频繁地从数据库请求数据。您还可以在会话中存储大量数据,但常识要求您应尽可能少地存储/需要存储数据。这是因为:

默认情况下,在PHP中,会话存储在磁盘上(在/ tmp目录中),在您开始看到性能下降之前,会根据平台的设计方式进行扩展。

操作码缓存/加速器怎么样?

eAcceleratorAPC和其他人(你可以找到一个PHP操作码缓存引擎列表here),不会(除了一两个具有特定功能)改进调用/返回这些变量(来自数据库),因为PHP是一种解释型语言。

这意味着每次请求PHP生成的页面时,服务器必须读入所需的各种文件,并在运行时将它们“编译”成机器可以理解的内容(操作码)。

PHP操作码缓存机制/引擎在缓存中保留此生成的代码,因此只需生成一次即可为数百或数百万个后续请求提供服务,因此,安装操作码缓存将减少生成页面所需的时间(有时高达90%)。

使用PHP操作码缓存可能是一个好主意,但不是为了减少对DB的连续调用......这不是他们的核心目的。

更大的更活跃/高负荷的网站怎么样?

由于用户连接而拥有更多流量和更高负载的大型网站通常使用基于内存的解决方案来存储常用和面向用户的数据(包括时区!)的关键部分 - 更具体地说是“基于内存的数据库表“或”分布式内存对象缓存“,可以在一个或多个服务器之间分配以平衡负载......

MySQL有memory/heap个表(在内存而不是在磁盘上创建),但仍需要SQL查询来返回数据/信息。毋庸置疑,它们比访问存储在磁盘上的数据要快得多。

PHP域中最流行的基于内存的缓存解决方案可能是memcached,它被许多公司/项目广泛使用,并描述为:

  

高性能,分布式内存对象缓存系统,本质上是通用的,但最初用于通过减轻数据库负载来加速动态Web应用程序... memcached允许您从系统的某些部分获取内存超出您的需求,并使您可以访问您需要的地方。

从长远来看(并且有显着的增长),这种方法是可取的。但是,如果不了解平台的负载和夹点/瓶颈,我建议默认使用PHP $_SESSION并从那里开始工作