PHP性能考虑?

时间:2008-09-22 01:41:42

标签: php performance scalability

我正在构建一个PHP网站,但目前我使用的唯一PHP在某些网页上包含了大约六个。 (我最终可能会使用一些数据库查询。)

简单的include()语句是关注速度还是缩放,而不是静态HTML?什么样的事情会导致网站陷入困境?

7 个答案:

答案 0 :(得分:5)

当然include()比静态页面慢。但是,对于现代系统,如果有的话,你很可能不会将此视为长期的瓶颈。在我看来,使用的好处包括让网站的常见部分保持最新,超过微小的性能损失(在一个页面上有不同的导航,因为你忘了更新它导致糟糕的用户体验,因而对你的不良感觉网站/公司/其它)。

使用缓存也无济于事 - 缓存代码要比include()慢。缓存唯一有效的时间就是你进行计算密集型计算(非常罕见,在网页上)或从数据库中获取数据。

答案 1 :(得分:4)

听起来你正在参与一些过早的优化。如果没有构建应用程序,虽然需要注意性能问题,但主要关注的是应该编写应用程序。

包含是生活中的事实。不要担心数字,担心保持代码组织良好(PEAR文件夹结构是一件很可爱的事情,如果你不知道我在谈论Zend Framework类文件的结构)。

专注于使用合理的抽象量编写应用程序。将所有数据库调用分组到一个或多个类中,以便最大限度地减少代码重复(KISS原则和所有内容),并且当需要重构和优化查询时,它们位于中心位置。还开始进行一些单元测试以防止回归。

一旦应用程序启动并运行,不要问我们什么是更快或更好,因为它取决于每个应用程序你的瓶颈是什么。可能会发现,即使你有很多包含,你的循环也会耗费你的时间,或者其他什么。一旦启动并运行,请使用XDebugprofile your code。寻找占用不成比例的时间然后重构的代码段。如果现在过分关注include和include_once之间的性能影响,当那些同步运行的curl请求正在吃你的早餐时,你最终会追逐鬼魂。

虽然在同一时间,最好的建议是通过php.net手册查看,并确保是否有内置函数做你正在尝试做的事情,使用它! PHP的基于C的扩展将始终比您可以编写的任何PHP代码更快,并且您会惊讶地发现您尝试做的事情已经完成了多少。

但同样,我不能强调这一点,过早的优化很糟糕!!! 只需提高你的应用程序的抽象水平,对其进行分析,然后修复实际上正在吃的东西你的时间,而不是修复你认为可能会耗费你的时间。

答案 2 :(得分:3)

严格来说,直接HTML总是比服务器端方法更快,因为服务器不必对代码进行任何解释。

要回答更大的问题, 会导致您的网站陷入困境;当代码导致问题与PHP相比时,没有特定的阈值。 (请记住,雅虎的许多网站都是由PHP驱动的,因此不要认为PHP无法扩展。)

我注意到的一件事是,PHP驱动的网站是最慢的网站,其中包含的内容超过了显示特定网页所需的内容。 OSCommerce(oscommerce.com)是最受欢迎的PHP驱动购物车之一。但是,它有一个坏习惯,即在每个页面上包含所有核心功能(以防万一)。因此,即使您不需要显示“信息框”,也会加载该功能。 另一方面,有许多PHP框架(例如CakePHP,Symfony和CodeIgniter)可以“根据需要加载”方法。

我会建议如下:

  1. 不包含比特定页面所需的更多功能
  2. 保持基本功能分开(尽可能使用MVC方法)
  3. 如果您认为您将拥有嵌套包含,则使用require_once而不是include(例如,页面A包含包含文件C的文件B)。这样可以避免多次包含同一个文件。如果找不到文件,它也会停止进程;从而有助于您的故障排除过程;)
  4. 如果可能,将静态页面缓存为HTML - 以避免在事情不发生变化时重新分析

答案 3 :(得分:2)

Nah包括罚款,没有什么可担心的。

您可能想要考虑稍微调整一下缓存标题,但除非您获得重要的点击量,否则应该没问题。假设这是所有静态数据,您甚至可以考虑将整个站点转换为静态HTML(最简单的方法:编写一个脚本,通过Web服务器抓取每个页面并将其转储到匹配的目录结构中)

大多数Web应用程序都受到数据库速度的限制(或者无论外部存储是什么,但是数据库的9/10倍),应用程序代码很少引起关注,并且它不会发出声音就像你正在做任何你需要担心的事情。

答案 4 :(得分:1)

在您就如何为您的网站构建代码做出任何长期决定之前,我建议您对Model-View-Controller设计模式进行一些阅读。虽然还有其他人,但这个似乎在网络开发界获得了很多支持,而且肯定会有一段时间。您可能想要了解Martin Fowler在Patterns of Enterprise Application Architecture中建议的其他一些设计模式,然后再做出最适合您需求的设计。

根据项目的大小和范围,您可能希望使用现成的PHP框架,如Zend Framework或PHP On Trax,或者您可以决定构建自己的解决方案。

特别是关于HTML内容的呈现,我强烈建议您使用某种形式的模板,以使您的业务逻辑与显示逻辑分开。我发现在我的开发中这个简单的规则在需要更改其中一个或另一个时节省了我的工作时间。我已经使用了http://www.smarty.net/">Smarty,我知道大多数框架都有自己的模板系统或提供插件架构,允许你使用自己的当您查看可能的解决方案时,我建议您寻找能够创建缓存版本的解决方案。

最后,如果你担心后端的速度,那么我强烈建议你研究一下如何最大限度地减少对后端数据存储的调用(无论是数据库还是系统文件)。尽量避免一次性加载和渲染太多内容(比如存储在包含数百条记录的表中的大型报表)。如果可能,寻找使用户界面一次加载较小位数据的方法。 如果您特别关注html内容及其CSS,Javascript或其他依赖项的实际加载时间,我建议您查看来自雅虎家伙的these suggestions

答案 5 :(得分:0)

添加JayTee提到的内容 - 在需要时加载功能。如果您没有使用任何自动执行此操作的框架,您可能需要查看PHP5中引入的__autoload()功能 - 基本上,如果您实例化某个特定类,则可以调用您自己的逻辑加载。这使您有机会包含()一个按需定义该类的文件。

答案 6 :(得分:0)

加速应用程序可以做的最重要的事情是使用Opcode缓存,例如APCWikipedia上有一个很好的列表和说明。

就简单包含而言,请注意不要在每个请求中包含太多文件,因为磁盘I / O可能导致应用程序无法很好地扩展。几十个包含应该没问题,但通常最好将最常包含的文件打包到一个脚本中,这样你就只有一个包含。在这里和那里你不需要加载的几个类的内存成本将比包含数百个较小文件的磁盘I / O的成本更好。