是否值得使用 require_once() 来节省内存?
Posted
技术标签:
【中文标题】是否值得使用 require_once() 来节省内存?【英文标题】:Is it worth using require_once() for memory savings? 【发布时间】:2011-04-02 13:44:29 【问题描述】:我想检查一下我对require_once()
的理解是否正确。我在文件foo.php
中有一堆函数。假设它们中的 7/8 总是被使用,其中一个相当罕见且相当大。我必须将这个函数的定义保存在foo.php
中。您能否告诉我以下方法是否取得了任何成就,以及您是否认为它所取得的成就值得。
require_once()
该特定文件并将执行传递给辅助函数。
我知道这可以为未运行该功能的请求节省服务器内存。我到底在保存什么? 只是保存函数体所需的内存?这意味着它必须是一个相当大的功能,然后才值得我猜。另外,如果我使用 APC 之类的东西,它会变得没那么有用吗?
请酌情更正或补充!
非常感谢。
【问题讨论】:
另请注意:require 需要的资源比 require_once 少,因为它不在已知位置检查文件。 【参考方案1】:更新:从您对 Gordon 的评论中,我看到您正在使用 Drupal:这种方法在那里不起作用,因为 Drupal 已经非常面向对象。这里描述的是利用静态类的基于函数的项目的自动加载机制。
正如 Gordon 所说,这只会为非常庞大的函数节省内存。但是,根据我的经验,将包含加载到内存中所占用的空间比保存代码所需的确切字节数要多得多。我不是 PHP 内部专家,但我认为代码已被解析或至少以任何一种方式进行了预处理。
假设您的 PHP 应用程序完全是基于函数的,没有 OOP,您想到的一个可以用来拆分包含的想法是将您的函数放入类中,并利用自动加载机制:
class maintenance_functions
public static function xyz() ................
并开始静态调用它们:
maintenance_functions::xyz();
一个类会占用一个文件。
将所有很少使用的函数分组到单独的文件中。
然后,您可以使用Autoloading 机制。这将在需要时自动加载所需的类。例如,如果我打电话给
datamining_functions::xyz();
自动加载器将查找包含datamining_functions
的文件并将其包含在内。这消除了完整的“require()”麻烦,让您专注于如何最有效地对函数进行分组。
这并不是向 OOP 的真正过渡:我们只是使用类构造来对函数进行分组,以便能够使用自动加载器。应该可以将函数迁移到此类类中,而无需进行重大重写。
【讨论】:
谢谢,不知道自动加载!仍然想知道从根本上说,在主模块中拥有函数所使用的唯一资源是否只是接近(如果不完全是)函数源代码大小的一点内存,还是还有更多? @Jes 以我的经验,大量的代码比实际的代码字节占用更多的内存。我认为任何代码,无论是否使用,都必须在包含时进行解析。解析巨大的包含也需要时间。 如果你使用public static function xyz()
,PHP5 会喜欢它(使用 $this 时会出错并阻止 E_STRICT 通知)【参考方案2】:
您应该使用Xdebug 来找出答案 - 价值与否是主观的。
【讨论】:
谢谢,但我想问问更有经验的人他们是否认为值得!【参考方案3】:我非常怀疑将它重构到一个单独的文件中是否会有所收获。此外,您是否真的对代码有任何问题,因为现在让您考虑这一点?你知道过早的优化是万恶之源。在您将时间浪费在无意义的 µ 优化上之前,分析您的代码以查看它是否以及在哪里存在瓶颈。
【讨论】:
是的,我并不想过早地进行优化,而是为了更好地理解 PHP!我正在使用 Drupal,它鼓励例如让您的代码在单独的文件中生成管理页面,以便在不使用时不会总是加载它们。但是,如果你想修改另一个模块的管理屏幕,你需要使用一个钩子,它需要在主模块文件中。这就是我开始思考的原因——我并不是真的想修改我的项目,只是了解问题。通过遵循 Drupal 的政策并分离管理功能,您究竟节省了什么? @Jes 如果有一组定义的函数,你肯定知道不会在当前脚本/任务/文件中使用,我确实会选择不包括它们。 @Jes 我不熟悉 Drupal,但我会说他们建议这样做是出于可维护性和分离关注点和责任的原因。 Admin 是 admin,所以它不应该是 regular 的一部分。如果你这样划分责任,你最好不要在不需要的时候包括它,就像在外面没有太阳的时候你不会戴墨镜一样。性能方面,它取决于包含多少文件以及您拥有多少包含路径,然后才会产生显着差异。以上是关于是否值得使用 require_once() 来节省内存?的主要内容,如果未能解决你的问题,请参考以下文章
是否仍然值得在移动 JavaScript 上使用 eval 来提高性能?