优化您的 PHP 设置
虽然实现操作码缓存是性能改进的一大创举,不过也有大量其他优化选项可供您基于 php.ini 文件中的设置优化您的 PHP 设置。这些设置更适合于生产实例;在开发或测试实例上,您可能不希望做这些变更,因为它会使得应用程序问题的调试变得更难。
让我们看一下对于性能提升很重要的一些项目。
应当禁用的选项
有若干 php.ini 设置应当予以禁用,因为它们常用作向后兼容性:
register_globals
— 在 PHP V4.2 之前该功能常常是默认值,其中传入的请求变量被自动赋给普通 PHP 变量。这样做除了引起重大安全问题之外(使未过滤的传入请求数据与普通 PHP 变量内容相混),对每一个请求这样做还会产生开销。因此禁用这一设置使您的应用程序更安全且能提高性能。 magic_quotes_*
— 这是 PHP V4 的另一遗留项,其中传入的数据会自动避开有风险的表单数据。它旨在作为一个安全特性,在将传入的数据发送到数据库之前对其进行整理,但不是很有效,因为它不能帮助用户预防常见的 SQL 注入攻击。由于大部分数据库层支持能更好地处理该风险的准备语句,禁用该设置会再次消除这个烦人的性能问题。 always_populate_raw_post_data
— 这仅当您出于某些原因需要查看传入的未过滤 POST
数据的整个负载时才需要。否则,它仅在内存中存储 POST 数据的一个副本,而这没有必要。 然而,在遗留代码上禁用这些选项会有风险,因为它们可能取决于其设置来实现正确执行。不应当基于被设置的这些选项来开发任何新代码,而且可能的话,您应当寻求方法来重构您的现有代码,避免使用它们。
应当禁用或调整设置的选项
您可以启用 php.ini 文件的一些优秀性能选项,来提升您的脚本速度:
output_buffering
— 您应当确保启用该选项,因为它会以块为单位将输出刷回到浏览器,而非以每个 echo
或 print
语句为单位,而后者会大大减缓您的请求响应时间。 variables_order
— 这个指令控制传入请求的 EGPCS(Environment
、Get
、Post
、Cookie
和 Server
)变量解析顺序。如果您没有使用某种超全局变量(比如环境变量),您可以安全地删除它们来获得一点加速,从而避免在每一个请求上解析它们。 date.timezone
— 这是在 PHP V5.1 中添加的一个指令,用于设置默认时区,然后用于后面将要介绍的 DateTime
函数。如果您不在 php.ini 文件中设置该选项,PHP 会执行大量系统请求来弄清它是什么,且在 PHP V5.3 中,对每一个请求会发出一个警告。 就以应当在您的生产实例上配置的设置而言,这些被看作是 “唾手可得”。就 PHP 而言,还有一件事需要考虑。这就是您的应用程序中 require()
和 include()
(以及其同级 require_once()
和 include_once()
)的使用。这些函数优化您的 PHP 配置和代码,以防止对每个请求进行不必要的文件状态检查,从而减少响应时间。
管理您的 require()
和 include()
从性能来看,文件状态调用(即为检查一个文件是否存在而对底层文件系统进行的调用)相当昂贵。文件状态的最大元凶之一以 require()
和 include()
语句的形式出现,这两个语句用于将代码带到脚本中。require_once()
和 include_once()
的同级调用更成问题,因为它们不仅需要验证文件是否存在,而且它之前没有包含在内。
那么解决这个问题的最好方式是什么?您可以做一些事来加快解决。
require()
和 include()
调用使用绝对路径。这将使 PHP 更清楚您希望包含的确切文件,因此无需为您的文件检查整个 include_path
。 include_path
中的条目数较低。这在很难为每个 require()
和 include()
调用提供绝对路径的情况(通常在大型遗留应用程序中会出现这种情况)下很有用,方法就是不检查您包含的文件不在的位置。 A