在PHP中哪个性能更好?

问题描述:

我一般包括1个功能文件到我的网站的hader,现在这个网站是相当高的流量,我只是喜欢做的每一件小事,我可以,所以在这里我的问题是,在PHP中哪个性能更好?

是更好的最佳包括多个较小的函数类型文件,只需要该页面所需的代码,或者它真的没有什么区别,只需将它加载为一个大文件,我当前的函数文件就具有我整个站点的所有功能,它大约有4,000行长,并加载在网站上的每一个页面加载,这是不好的?

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

在硬币的另一面,我开始了一个企业级项目,其中一些操作有一个include()树,该树经常扩展到数百个文件中。对这些操作进行分析表明,仅在include()呼叫中花费的时间在10秒钟的加载操作中达到2-3秒(这是PHP4)。

+1

请记住,这些4k行将被解析并运行,除非你有一些优化器运行哪个缓存编译字节码,但最后我看到这些东西是有成本的,所以通常不会安装,除非你付出了代价。 – Joey 2009-08-02 00:04:42

+1

是的,那是真的。但是,处理多个文件的磁盘搜寻也有成本。如果你假设他把它分成10行,每行400行,平均每个文件中包括4行,那么他的行数就是1600行,4行。问题是解析行数的减少是否超过了include()开销。我假设这种差异将会特别小。唯一可以确定的方法就是对其进行基准测试。实际上,如果您处于这种优化级别,那么操作码缓存将花费更多时间。 – zombat 2009-08-02 00:19:07

通常,将文件分解为更小的文件会更好,文件管理更明智,因为您只需加载实际使用的文件。但是,在4000条线路上,它可能不会有太大的区别。

我建议类似这样

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

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

好主意谢谢 – JasonDavis 2009-08-02 00:32:44

我认为这将是更好,如果你可能分裂的功能文件成适合于每个页面组件的解决方案;并在适当的页面中调用这些组件。只是我的2美分!

p/s:我是一名PHP业余爱好者,我正在努力制作一个PHP网站;我没有使用任何功能。那么你能否告诉我你需要什么功能的网站?

+0

php.net网站拥有所有原生php函数,但是您可以创建执行特定函数/任务的代码并将其放入您自己的函数中,然后可以一次又一次地调用函数,所以您不必''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''不必写电子邮件写上相同的代码块 – JasonDavis 2009-08-02 00:22:02

根据我的经验,有一个包含到处的大型包含文件实际上可能会导致性能下降。我参与了一个浏览器游戏,我们将所有游戏规则作为动态生成的PHP(以及其他),并且文件的重量约为500 KiB。它肯定会影响性能,我们考虑生成一个PHP扩展。然而,像往常一样,我会说你应该做你现在正在做的事情,直到它是一个性能问题,然后根据需要进行优化。

如果你可以在你的服务器上安装扩展,你应该看看APCsee also)。
顺便说一下,它是免费的;-);但您必须是您的服务器的管理员才能安装它;所以它通常不提供共享托管...

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

基本上,当一个PHP脚本被调用时,发生两件事情:

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

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


要回答这个问题有点多:

  • 4000行的并不多,表演讲;打开任何大型应用程序/框架的几个文件,你将迅速得到几千行
  • a 真的很重要要考虑的事情是可维护性:什么会更容易与你合作,你的团队 ?
  • 加载很多小文件可能意味着很多系统调用,这些调用很慢;但那些可能会被操作系统缓存...所以可能不是相关
  • 如果你正在做的甚至1个数据库查询,这一个(PHP服务器和数据库服务器之间包括网络往返)大概会比解析几千行花费更多的时间;-)

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

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

因为分解功能的原因是可维护性。如果你需要改变一个函数,你需要在你的monalithic包含文件中找到它。你也可能有非常非常相似的功能,但甚至没有意识到它。通过他们所做的功能对函数进行排序可以让您比较它们并摆脱不需要的东西,或者将两个函数合并为一个更通用的函数。

大部分时间光盘IO是什么会杀死你的服务器,所以我认为你从光盘获取的较小文件更好。此外,如果可以安装APC,那么文件将被存储在内存中,这是一个巨大的胜利。