我有一个不到 40 万用户的论坛。帖子的时区设置为中央标准时间。我可能会在数据库中保存与 GMT 相关的时区偏移量,例如 +3、-8 等。我想知道的是:我应该使用 APC 或 xcache 之类的操作码缓存还是基于文件系统的缓存来缓存这些?我的目标是避免为每个人的时区连续调用数据库。
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 目录中),这将在您开始看到性能下降之前扩展到一定程度 - 基于您的平台设计方式。
那么操作码缓存/加速器呢?
eAccelerator、APC和其他(您可以在此处找到 PHP 操作码缓存引擎的列表),不会(除了具有特定功能的一两个之外)改进此类变量(来自数据库)的调用/返回,因为 PHP 是一个解释语。
这意味着每次请求 PHP 生成的页面时,服务器必须读入所需的各种文件,并将它们“编译”成机器在运行时可以理解的内容(操作码)。
PHP 操作码缓存机制/引擎将生成的代码保存在缓存中,因此只需生成一次即可为数以百万计的后续请求提供服务,因此,安装操作码缓存将减少生成页面所需的时间(有时通过高达 90%)。
使用 PHP 操作码缓存可能是个好主意,但不要减少对数据库的持续调用……这不是他们的核心目的。
更大更活跃/高负载的站点呢?
由于用户并发性而具有更多流量和更高负载的大型站点通常使用基于内存的解决方案来存储常用和面向用户的数据(包括时区!)的关键部分 - 更具体地说是“基于内存的数据库表”或“分布式内存对象缓存”,可以分布在一台或多台服务器之间以平衡负载......
MySQL 有内存/堆表(在内存中而不是在磁盘上创建),但仍然需要 SQL 查询来返回数据/信息。不用说,它们比访问存储在磁盘上的数据要快得多。
可能 PHP 领域中最流行的基于内存的缓存解决方案是memcached,它被许多公司/项目广泛使用,并描述为:
一个高性能的分布式内存对象缓存系统,本质上是通用的,但最初旨在通过减轻数据库负载来加速动态 Web 应用程序...... memcached 允许您从系统的某些部分获取内存需要并使其可访问您拥有的区域少于您的需要。
从长远来看(并且随着显着增长),这种方法是可取的。但是在不了解平台的负载和夹点/瓶颈的情况下,我建议$_SESSION
默认使用 PHP 并从那里开始工作。