1

我继承了一个基于类的 PHP 站点,该站点的每个页面都是它自己的类。index.php处理您根据参数查看的页面,p然后调用该特定类。例如,网站的搜索页面很简单mysite.com/?p=search

index.php调用的第一行之一是一个Autoload.php文件,该文件执行站点include每个基于类的页面。这意味着无论您在哪个页面上,脚本都会加载其他每个页面/类。

我的问题:

  1. 这些页面/类之间没有联系,所以真的必要在每次页面加载时都加载它们吗?
  2. 它是否会减慢每个页面加载时必须超过 50 个页面/类的脚本,include还是可以忽略不计
  3. 如果是这样,那么我不应该进行基于 if 的检查来确定我应该根据p参数加载哪个页面/类,并且只加载那个页面/类,而不是在每个页面加载时加载每个页面吗?
  4. 或者是否还有其他一些我不知道的潜在缺点?
4

2 回答 2

3

这是一个令人困惑的文件名称,因为自动加载是 PHP 中的一种机制,它允许您在需要时加载类,当您有很多类并且每次执行只需要少数类时,这是一个很好的解决方案。

例如:

function autoload($class_name) {
  $file = "classes/$class_name.php";

  // You could add some checks here (e.g. whether the file exists, whether the
  // class indeed exists after the file is loaded) to facilitate better errors,
  // of course this would marginally increase the time needed to load each class.

  require $file;
}

// Register the `autoload` function with PHP's autoload mechanism
spl_autoload_register('autoload');

// This will execute `autoload('Class')` (unless `Class` is already defined)
$instance = new Class;

所以,回答你的问题:

  1. 没有必要全部加载它们,但是使用的类必须是可用的,或者通过一起加载它们(当前情况)、有条件地加载它们(if(p == 'whatever') require 'classes/whatever.php'),或者通过使用自动加载。

  2. 每当包含文件时都会有一些延迟,因为必须解析/执行该文件。PHP 相当快,但包含不需要的文件仍然是一种浪费。如果您使用字节码缓存,则仍必须执行检索到的字节码。

  3. 这是改进的一种途径,自动加载提供了一种更动态的选择。

  4. 如果您的任何页面类依赖于另一个类,则依赖关系可能会成为问题,因为您的条件加载可能会变得非常臃肿。

如果您正在使用它,还有一些关于字节码缓存的附加材料:

总结似乎是,只要您使用includerequire加载文件,字节码缓存就会按预期工作。

于 2012-06-09T15:50:09.387 回答
2

使用条件 require 或 include 很慢。

只需要你提到的主文件中的所有类,没有任何条件,就在全局范围内。编译后的代码将被缓存为一个,您不会因在运行时加载额外的代码而受到惩罚。

编辑:您将受益于启用 PHP APC 或其他一些 PHP 加速器。

编辑 2:PHP APC 将在未来版本中成为 PHP 核心的一部分(已宣布)。无论您是使用条件加载还是一次性加载,您都将从 PHP APC 中受益。如果您已经拥有它,一次为您的 50 页加载可能会很好。

编辑 3下载 PHP APC 源代码并找到一个名为 apc.php 的查找文件。从您的服务器运行 apc.php 以查看一些非常出色的 APC 状态和统计信息,其中包括当前内存使用情况和最大内存(另见此处)。

于 2012-06-09T15:25:13.047 回答