【问题标题】:Including file in PHP?在 PHP 中包含文件?
【发布时间】:2009-05-21 04:56:27
【问题描述】:

我正在开发一个需要包含多个文件的应用程序,如下所示:

File1.php will include File2.php

File2.php will include File3.php

File3.php will include File4.php

现在,最好的优化方式是什么?我尝试使用 include(),但我认为它会降低我的服务器速度,因为我的服务器负载图比正常服务器负载高约 3-5 倍。

这些所有文件都是围绕50 KB 的重要手段。那么任何人都可以建议我包含这些文件的最佳选择是什么,以免影响网站的速度,

哪个最好?

require()

require_once()

include()

include_once()

或者如果有人有其他选择,请告诉我,

谢谢

【问题讨论】:

    标签: php optimization include performance


    【解决方案1】:

    include() 和 require() 之间的区别在于您是否收到警告或致命错误(分别)。 PHP 文档没有提到任何性能差异。

    如果您想避免重复包含文件的内容,使用 _once() 变体很有用。来自PHP docs for include_once:

    include_once() 可用于在特定脚本执行期间可能多次包含和评估同一文件的情况,因此在这种情况下,它可能有助于避免函数重新定义、变量值重新分配等问题.

    【讨论】:

      【解决方案2】:

      您应该重新组织您的文件。有一个包含所有需要文件的“common.php”文件。你不应该有这样的链条。

      我真诚地怀疑一些包含会降低您的服务器速度。大多数 Web 应用程序都有数十个甚至数百个 PHP 文件。 3 个额外的文件不会让您的应用程序减慢这么多。

      此外,您提到的函数之间的速度差异可以忽略不计,尽管您应该使用 include_once/require_once 而不是它们的对应函数,以确保您不会多次包含同一个文件。

      【讨论】:

      • 我认为文件组织还可以,因为如果我使用 common.php 包含其他文件,那么 File1 将包含 common.php,而 common.php 将获取 reuiqred 文件。我已经在做的几乎一样......
      • 我在网上的任何地方都读到“include_once/require_once”比“include/require”慢,reuire 比 include 慢??我没有确切知道谁在写谁错???
      • @Parshant:是的,但是我的方式会更有条理,并且将来更易于维护。老实说,不要担心功能之间的速度差异非常小。慢 0.000002 秒不会对您造成任何伤害。 ;)
      • @Prashant:如果有疑问,请自行测量。在现实世界中,这 4 个函数之间的速度差异可以忽略不计 - 真正的性能瓶颈在其他地方,而且要严重几个数量级(再次,性能测量在这里是必要的)。
      【解决方案3】:

      只需要一张便条就知道了。在我的一个项目中,我必须为很多类(大约 50 个)实现一种工厂。我为每个类创建了一个文件,并且包含它们非常慢。我决定将它们合并到一个文件中。这种增加的性能非常可观。

      我认为这与有很多条目时文件系统速度下降有关...不知道为什么会这样,但事实是 - 包含 1 个大文件比 50 个小文件快得多。

      【讨论】:

      • 没错,但是1个文件和4个文件的差别会小很多。
      • 也是正确的,但是当您使用 4 而不是 1 并在项目中执行 10 次时... 4*10 = 40 而不是 10... 好吧,这只是一个注释,可能,题外话。我的意思是“记住这个问题”。
      【解决方案4】:

      Tech Your Universe 上的一篇文章谈到了 require vs require_once issue。从本质上讲,在执行绝对路径时,require() 肯定比require_once() 快​​,include() 绝对比include_once() 快。当他们用 sans-once 调用替换 once 调用时,他们的确切主张:

      首先,strace 显示有 2848 个系统调用来服务一个页面,关闭 从 4782,(-40%)。接下来我去了ab 进行了更多测试,发现 平均页面请求时间下降到 36.5,从 46.5ms (-22%),服务器能够处理 27.1 个请求 每秒,从 21.4 (+%22) 上升。

      根据comment 90017 by Konstantin Rozinov on the require_once page on php.net 的说法,require()require_once() 之间的区别很小,仅在大型 Web 应用程序上有所不同。我个人喜欢大的定义,但我想我们明白了。评论员还声称“在使用 APC 操作码缓存时,两者的速度差异完全无关紧要”。关于 require 和 require_once 的实际实现:“这表明操作系统(在我的情况下是 Ubuntu Linux)或 Apache 正在“缓存”或知道先前 stat() 调用的结果,所以它不会重复它们。”把它当作它的价值。

      我的个人总结:

      • 如果你要使用require_once, 尝试使用绝对路径。
      • 一定要使用某种操作码缓存。

      【讨论】:

        【解决方案5】:

        我更喜欢将所有内容拆分成尽可能多的文件以方便我开发,然后将其全部拼合为一个文件,然后再将其上传到服务器。

        PHP 字符串和正则表达式函数让编写一个替换任何包含“somefile.php”的脚本变得非常容易;包含该文件的实际内容(必要时剥离 )。

        【讨论】:

        • 你测量过这样做的加速吗?我想知道这是否对性能有任何明显的影响。
        【解决方案6】:

        绝对选择include()require() 而不是“*_once()”变体。你可能需要某种opcode cache 来提高你的表现。

        【讨论】:

          【解决方案7】:

          您的答案主要取决于您的需要。要记住的要点是:

          1. include 比 require 更快。
          2. 如果文件被“包含”但未找到,则不会导致致命错误。该脚本将继续运行。
          3. 如果“需要”文件但未找到,则脚本执行会立即停止。

          但是,附带说明: 如果您的应用程序在file3中包含file4,在file2中包含file3,在file1中包含file2,那么我会说您应该重新考虑您的文件组织。我相信你可以想出一个更好的方法来组织你的代码到文件中。

          补充:include 和 require 之间的速度差异非常小。但是,require_once() 比 require() 重得多。对于 include_once() 和 include() 也是如此。

          干杯,

          jrh

          【讨论】:

          • 你有关于 include 和 require 之间速度差异的来源吗?我希望在某处进行测试。
          • 无论哪种方式,速度差异都会是几微秒;没有什么值得担心的。
          • 好吧,我没有源代码。但我清楚地记得在一些文档中阅读过它。但是,是的,几微秒的差异几乎不值得担心。
          • include() 和 require() 都执行相同的代码。只有在(文件打开)错误的情况下才会出现 if(type==require) { message, bailout } else { message }(参见 zend/zend_language_scanner.l, compile_file() )
          【解决方案8】:

          我建议使用 xdebug PHP 扩展来对您的脚本进行基准测试和分析。 它会告诉你每个函数执行的时间。 您可以在此处找到有关如何安装它以及它可以做什么的更多信息:http://www.xdebug.org/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-02
            • 1970-01-01
            • 2012-02-13
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            相关资源
            最近更新 更多