to require_once()或Not to require_once()

时间:2011-06-15 14:20:25

标签: php performance require-once

我正在从头开始构建PHP CMS。我的系统中有一个超级核心文件,我目前已自动导入构成系统核心的所有其他包和类。在典型的页面上,只使用了其中的一些类和方法。

考虑到加载require_once()加载服务器以包含所有这些文件,以及用户必须等待页面加载的时间,我想知道我应该采取哪条路径:

  1. 保持超级核心的原样并自动包含包含此核心文件的每个页面的所有系统核心。
  2. 使用超级核心仅包含基本软件包,例如数据库管理,并根据需要导入其他软件包/类。
  3. 有人可以让我知道这两个选项中哪一个是最好的,以及它的优缺点的简要概述?

    感谢您的时间!!!

3 个答案:

答案 0 :(得分:6)

您问的是哪个是最佳负载策略的问题。这通常是discussed related to auto-loaders

与任何策略一样,有利有弊。包括所有文件可以省去忘记一个的麻烦。另一个自动加载器也不会忘记文件。

但是,您不能总是使用一种或另一种策略,但如果您实施多种策略,则可以根据需要进行选择。例如,如果您开发CMS,事情可能会经常发生变化。但是,如果CMS安装在服务器上,则该版本不会经常更改。

因此,在生产中,将所有核心库合并到一个文件中并在启动时需要它们的策略可能是一个好处,具体取决于服务器的负载量。

为了便于构建自己的系统,我可以提出一个自动加载器。如果按文件排列类文件,它们将在您使用该类时自动加载。

当您在开发中实现某个步骤时,您实际上知道核心文件是什么。然后,您可以默认加载它们,这样就不会再为自动加载器触发它们了。

答案 1 :(得分:2)

不要加载你不会使用的东西。实施autoloader或加深您的require_once。

即使性能可忽略不计,较少的文件包含会增加您快速查找错误并确定应用程序流量的能力。

答案 2 :(得分:2)

今年早些时候,我在用PHP开发框架时遇到了这个问题。

我考虑了利弊,这是我的评价:

选项1 - 前端控制器模式脚本包括所有其他脚本

优点

  • 包含在一个脚本中完成;你可以看到哪些文件包含在一目了然。
  • 包含特定包总是被调用一次,没有开销。

缺点

  • 考虑这样的情况:

我们有两个班级RectangleShapeRectangle是一个子类,即Shape的扩展名。但是,核心脚本按字母顺序包含类。因此,当包含Rectangle时,找不到Shape,PHP将引发错误。

Rectangle上课:

class Rectangle extends Shape{

}

Shape上课:

class Shape{

}
  • 当不需要的所有内容也被加载到内存中时,会有更多的开销。

选项2 - 加载主程序包,然后根据需要加载其他程序包

优点

  • 仅在需要时包含文件。以另一种方式减少开销
  • 解决选项1中提到的问题。
  • 您可以专注于每个包从其他包中需要的内容,只需加载它们
  • 即可

缺点

  • 开销,因为可能会发生对特定包的多个请求。
  • 包裹包含在每个文件中完成。

编程代码适用于人类。因此,为了使事情更具逻辑性并解决问题,我选择了选项2来寻找框架。