- 替代 PHP 缓存(APC)可能是 PHP 最流行的操作码缓存(参见 参考资料
)。它由若干核心 PHP 开发人员所开发,做出了很大贡献,Facebook 和 Yahoo! 的工程师赋予了其速度和稳定性。它还支持用于处理 PHP 请求的若干其他速度改进,包括一个用户缓存组件,这将在本文后面探讨。 - Wincache 是主要由 Microsoft® 的 Internet Information Services (IIS) 团队积极开发的一个操作码缓存,仅供在使用 IIS web 服务器的 Windows® 上使用(参见 参考资料
)。开发它的主要动力在于使 PHP 成为 Windows-IIS-PHP 堆栈上的一流开发平台,因为据知 APC 在该堆栈上运作的不是很好。它在功能上非常类似于 APC,且支持一个用户缓存组件,以及一个内置会话处理程序,以将 Wincache 作为一个会话处理程序直接加以利用。 - eAccelerator 是原始 PHP 缓存之一 Turck MMCache 操作码缓存(参见 参考资料
)的一个派生。不同于 APC 和 Wincache,它仅是一个操作码缓存和优化器,因此它不包含用户缓存组件。它在 UNIX® 和 Windows 堆栈上完全兼容,且对于不打算利用 APC 或 Wincache 提供的其他功能的站点很流行。如果您要使用 memcache 这样的解决方案来为多 web 服务器环境提供一个单独的用户缓存服务器,那么这就是常见情况。
- register_globals — 在 PHP V4.2 之前该功能常常是默认值,其中传入的请求变量被自动赋给普通 PHP 变量。这样做除了引起重大安全问题之外(使未过滤的传入请求数据与普通 PHP 变量内容相混),对每一个请求这样做还会产生开销。因此禁用这一设置使您的应用程序更安全且能提高性能。
- magic_quotes_* — 这是 PHP V4 的另一遗留项,其中传入的数据会自动避开有风险的表单数据。它旨在作为一个安全特性,在将传入的数据发送到数据库之前对其进行整理,但不是很有效,因为它不能帮助用户预防常见的 SQL 注入攻击。由于大部分数据库层支持能更好地处理该风险的准备语句,禁用该设置会再次消除这个烦人的性能问题。
- always_populate_raw_post_data — 这仅当您出于某些原因需要查看传入的未过滤 POST 数据的整个负载时才需要。否则,它仅在内存中存储 POST 数据的一个副本,而这没有必要。
- output_buffering — 您应当确保启用该选项,因为它会以块为单位将输出刷回到浏览器,而非以每个echo 或 print 语句为单位,而后者会大大减缓您的请求响应时间。
- variables_order — 这个指令控制传入请求的 EGPCS(Environment、Get、Post、Cookie 和 Server)变量解析顺序。如果您没有使用某种超全局变量(比如环境变量),您可以安全地删除它们来获得一点加速,从而避免在每一个请求上解析它们。
- date.timezone — 这是在 PHP V5.1 中添加的一个指令,用于设置默认时区,然后用于后面将要介绍的DateTime 函数。如果您不在 php.ini 文件中设置该选项,PHP 会执行大量系统请求来弄清它是什么,且在 PHP V5.3 中,对每一个请求会发出一个警告。
- 为所有 require() 和 include() 调用使用绝对路径。这将使 PHP 更清楚您希望包含的确切文件,因此无需为您的文件检查整个 include_path。
- 保持 include_path 中的条目数较低。这在很难为每个 require() 和 include() 调用提供绝对路径的情况(通常在大型遗留应用程序中会出现这种情况)下很有用,方法就是不检查您包含的文件不在的位置。
- 确保每个表都有一个主键。这为表提供一个默认顺序和快速方式来联接其他表。
- 确保一个表中的任何外键(即链接记录到另一个表中的记录的键)的索引得到合理编制。许多数据库会自动对这些键施加约束,以便值真正匹配另一个表中的一条记录,这有助于摆脱这一困难。
- 试图限制一个表中的列数。一个表中有太多列比仅有一些列时进行查询所需的扫描时间要长。此外,如果您有不常用的含多个列的一个表,您也在通过 NULL 值字段浪费磁盘空间。文本或 blob 等可变大小字段也是如此,其中表大小的增长可以远超过需求。在这种情况下,您应当考虑将其他栏分成不同的表,在记录的主键上将其联合起来。