【发布时间】:2010-11-16 02:39:33
【问题描述】:
我通常在我的网站的 hader 中包含 1 个函数文件,现在这个网站的流量非常高,我只想尽我所能,所以我的问题是,
最好包含多个较小的函数类型文件,只包含该页面所需的代码,还是将它们全部加载为 1 个大文件真的没有区别,我当前的函数文件具有我整个的所有函数站点,它大约有 4,000 行长,并且在站点范围内的每个页面加载时都会加载,这很糟糕吗?
【问题讨论】:
标签: php performance include
我通常在我的网站的 hader 中包含 1 个函数文件,现在这个网站的流量非常高,我只想尽我所能,所以我的问题是,
最好包含多个较小的函数类型文件,只包含该页面所需的代码,还是将它们全部加载为 1 个大文件真的没有区别,我当前的函数文件具有我整个的所有函数站点,它大约有 4,000 行长,并且在站点范围内的每个页面加载时都会加载,这很糟糕吗?
【问题讨论】:
标签: php performance include
很难说。 4,000 行在文件解析领域并没有那么大。在代码管理方面,这开始变得笨拙,但是通过将其分解为 2、5 或 10 个文件并且页面只包含他们需要的少数几个文件,您不太可能看到太多可衡量的性能差异(这是更好的编码实践,但这是一个单独的问题)。您读取的行数与解析器需要打开的文件数的差异似乎不足以保证任何重要的事情。我最初的反应是,这可能不是您需要担心的问题。
在硬币的另一面,我在一个企业级项目中工作,其中一些操作有一个include() 树,通常扩展到数百个文件。分析这些操作表明 include() 调用所花费的时间仅占 10 秒加载操作的 2-3 秒(这是 PHP4)。
【讨论】:
如果你可以在你的服务器上安装扩展,你应该看看APC (see also)。
顺便说一句,它是免费的 ;-) ;但您必须是服务器的管理员才能安装它;所以一般不会在共享主机上提供...
这就是所谓的“操作码缓存”。
基本上,当调用 PHP 脚本时,会发生两件事:
APC 将操作码保存在 RAM 中;所以文件不必在每次调用时都重新编译——这对 CPU 负载和性能来说都是一件好事。
多回答一下这个问题:
【讨论】:
我认为最好将函数文件拆分为适合每个页面的组件;并在适当的页面中调用这些组件。只是我的 2 美分!
p/s:我是一名 PHP 爱好者,我正在尝试制作一个 PHP 网站;我没有使用任何功能。那么您能告诉我您需要为网站提供哪些功能吗?
【讨论】:
根据我的经验,拥有一个随处包含的大型包含文件实际上会降低性能。我在一个浏览器游戏中工作,我们将所有游戏规则作为动态生成的 PHP(以及其他),文件大小约为 500 KiB。它肯定会影响性能,我们考虑改为生成 PHP 扩展。
但是,像往常一样,我会说你应该做你现在正在做的事情,直到它出现性能问题,然后根据需要进行优化。
【讨论】:
如果您加载一个 4000 行的文件并使用 1 个 10 行的函数,那么是的,我会说它效率低下。即使你用了1000行的很多功能,它仍然是低效的。
我的建议是将相关功能组合在一起并将它们存储在单独的文件中。这样,如果页面只处理例如数据库函数,您可以只加载数据库函数文件/库。
拆分功能的另一个原因是可维护性。如果你需要改变一个函数,你需要在你的整体包含文件中找到它。您可能还拥有非常非常相似但甚至没有意识到的功能。根据功能对功能进行排序,您可以比较它们并删除不需要的功能,或者将两个功能合并为一个更通用的功能。
【讨论】:
大多数情况下,Disc IO 会杀死您的服务器,因此我认为您从光盘中获取的文件越少越好。此外,如果可以安装 APC,那么文件将被编译到内存中,这是一个很大的胜利。
【讨论】:
通常,从文件管理的角度来看,将内容分解为更小的文件会更好,因为您只需要加载您实际使用的文件。但是,在 4,000 行时,它可能不会产生太大影响。
我会建议类似的解决方案
function inc_lib($name)
{
include("/path/to/lib".$name.".lib.php");
}
function inc_class($name)
{
include("/path/to/lib".$name.".class.php");
}
【讨论】: