您真的需要在每个页面加载时自动加载基于类的站点的所有页面吗?

时间:2012-06-09 15:10:12

标签: php class include autoload

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

index.php中的第一行中的一行调用Autoload.php文件,该文件执行{{1>} 每个单个基于类的网站页面。这意味着无论您使用哪个页面,脚本都会加载每个单个其他页面/类。

我的问题:

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

2 个答案:

答案 0 :(得分:2)

使用条件要求或包含很慢。

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

编辑:您将从启用PHP APC或其他PHP加速器中受益。

编辑2:PHP APC将在未来版本中成为PHP核心的一部分(已经公布)。您将受益于PHP APC,无论您是使用条件加载,还是一次加载所有内容。如果您已经拥有它,请立即加载所有50页可能没问题。

编辑3 Download PHP APC source code并找到名为apc.php的查找文件。从服务器运行apc.php,查看一些非常好的APC状态和统计信息,其中包括当前内存使用情况和最大内存(另请参阅here)。

答案 1 :(得分:2)

这是一个令人困惑的文件名,因为自动加载是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. 如果您的任何页面类依赖于另一个类,依赖关系可能会成为一个问题,因为您的条件加载可能会非常膨胀。

  5. 如果您正在使用字节码缓存,还需要一些额外的材料:

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