【问题标题】:Which is better performance in PHP?PHP中哪个性能更好?
【发布时间】:2010-11-16 02:39:33
【问题描述】:

我通常在我的网站的 hader 中包含 1 个函数文件,现在这个网站的流量非常高,我只想尽我所能,所以我的问题是,

最好包含多个较小的函数类型文件,只包含该页面所需的代码,还是将它们全部加载为 1 个大文件真的没有区别,我当前的函数文件具有我整个的所有函数站点,它大约有 4,000 行长,并且在站点范围内的每个页面加载时都会加载,这很糟糕吗?

【问题讨论】:

    标签: php performance include


    【解决方案1】:

    很难说。 4,000 行在文件解析领域并没有那么大。在代码管理方面,这开始变得笨拙,但是通过将其分解为 2、5 或 10 个文件并且页面只包含他们需要的少数几个文件,您不太可能看到太多可衡量的性能差异(这是更好的编码实践,但这是一个单独的问题)。您读取的行数与解析器需要打开的文件数的差异似乎不足以保证任何重要的事情。我最初的反应是,这可能不是您需要担心的问题。

    在硬币的另一面,我在一个企业级项目中工作,其中一些操作有一个include() 树,通常扩展到数百个文件。分析这些操作表明 include() 调用所花费的时间仅占 10 秒加载操作的 2-3 秒(这是 PHP4)。

    【讨论】:

    • 但请记住,那些 4k 行必须被解析并为 每个 页面访问运行。除非你运行了一些优化器来缓存已编译的字节码,但最后我看到这些东西是有代价的,所以除非你付费,否则通常不会安装。
    • 是的,这是真的。但是处理多个文件的磁盘寻道也是有代价的。如果您假设他将其拆分为 10 个文件,每个文件 400 行,并且平均每个文件中包含 4 个文件,那么他将减少到 1600 行代码和 4 个文件。问题是解析行数的减少是否超过了增加的 include() 开销。我假设差异将非常小。当然,唯一确定的方法是对其进行基准测试。确实,如果您处于该级别的优化,那么花在操作码缓存上的时间会更好。
    • 好的,感谢 cmets,如果我真的决定拆分成更小的文件,比如论坛功能、博客功能等,因为我的网站有数百个页面都包含我的 1 个功能文件,我可以只输入需要确定在包含的函数文件中加载哪些文件的代码,而不是编辑一堆文件,对吗?我知道这不会很漂亮,但没关系?
    • 我也计划很快使用 APC 和 memcache,我只是想清理我的代码,增加一些性能,并在我的网站离线几周时进行一些重组。我也有一个单独的 mysql 服务器,也许我应该把 memcache 也放在那里
    【解决方案2】:

    如果你可以在你的服务器上安装扩展,你应该看看APC (see also)。
    顺便说一句,它是免费的 ;-) ;但您必须是服务器的管理员才能安装它;所以一般不会在共享主机上提供...

    这就是所谓的“操作码缓存”。

    基本上,当调用 PHP 脚本时,会发生两件事:

    • 脚本被“编译”成操作码
    • 操作码被执行

    APC 将操作码保存在 RAM 中;所以文件不必在每次调用时都重新编译——这对 CPU 负载和性能来说都是一件好事。


    多回答一下这个问题:

    • 4000行不算多,就表演而言;打开任何大型应用程序/框架的几个文件,您很快就会得到几千行代码
    • 要考虑的非常重要的事情是可维护性:对您和您的团队来说,使用什么会更容易?
    • 加载许多小文件可能意味着许多系统调用很慢;但那些可能会被操作系统缓存...所以可能不相关
    • 如果您正在执行 1 个数据库查询,那么这一(包括 PHP 服务器和 DB 服务器之间的网络往返)可能会比解析几千行花费更多的时间 ;-)

    【讨论】:

      【解决方案3】:

      我认为最好将函数文件拆分为适合每个页面的组件;并在适当的页面中调用这些组件。只是我的 2 美分!

      p/s:我是一名 PHP 爱好者,我正在尝试制作一个 PHP 网站;我没有使用任何功能。那么您能告诉我您需要为网站提供哪些功能吗?

      【讨论】:

      • php.net 站点拥有所有原生 php 函数,但是您可以创建执行某些功能/任务的代码并将其放入您自己的函数中,该函数可以被反复调用,因此您不必将相同的代码块电子编写一百次
      【解决方案4】:

      根据我的经验,拥有一个随处包含的大型包含文件实际上会降低性能。我在一个浏览器游戏中工作,我们将所有游戏规则作为动态生成的 PHP(以及其他),文件大小约为 500 KiB。它肯定会影响性能,我们考虑改为生成 PHP 扩展。

      但是,像往常一样,我会说你应该做你现在正在做的事情,直到它出现性能问题,然后根据需要进行优化。

      【讨论】:

        【解决方案5】:

        如果您加载一个 4000 行的文件并使用 1 个 10 行的函数,那么是的,我会说它效率低下。即使你用了1000行的很多功能,它仍然是低效的。

        我的建议是将相关功能组合在一起并将它们存储在单独的文件中。这样,如果页面只处理例如数据库函数,您可以只加载数据库函数文件/库。

        拆分功能的另一个原因是可维护性。如果你需要改变一个函数,你需要在你的整体包含文件中找到它。您可能还拥有非常非常相似但甚至没有意识到的功能。根据功能对功能进行排序,您可以比较它们并删除不需要的功能,或者将两个功能合并为一个更通用的功能。

        【讨论】:

          【解决方案6】:

          大多数情况下,Disc IO 会杀死您的服务器,因此我认为您从光盘中获取的文件越少越好。此外,如果可以安装 APC,那么文件将被编译到内存中,这是一个很大的胜利。

          【讨论】:

            【解决方案7】:

            通常,从文件管理的角度来看,将内容分解为更小的文件会更好,因为您只需要加载您实际使用的文件。但是,在 4,000 行时,它可能不会产生太大影响。

            我会建议类似的解决方案

            function inc_lib($name)
            {
                include("/path/to/lib".$name.".lib.php");
            }
            
            function inc_class($name)
            {
                include("/path/to/lib".$name.".class.php");
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-12
              • 2011-10-06
              • 2011-04-04
              • 2012-06-27
              • 2011-11-24
              • 2019-05-06
              • 2011-06-12
              相关资源
              最近更新 更多