【发布时间】:2008-09-22 01:41:42
【问题描述】:
我正在建立一个PHP 网站,但目前我使用的唯一PHP 是在某些页面上包含六个左右。 (我最终可能会使用一些数据库查询。)
相对于静态HTML,简单的include() 语句是否关注速度或扩展?什么样的事情往往会导致网站陷入困境?
【问题讨论】:
标签: php performance scalability
我正在建立一个PHP 网站,但目前我使用的唯一PHP 是在某些页面上包含六个左右。 (我最终可能会使用一些数据库查询。)
相对于静态HTML,简单的include() 语句是否关注速度或扩展?什么样的事情往往会导致网站陷入困境?
【问题讨论】:
标签: php performance scalability
当然 include() 比静态页面慢。但是,对于现代系统,您不太可能在很长一段时间内将其视为瓶颈——如果有的话。在我看来,使用的好处包括使您网站的公共部分保持最新而不是对性能的微小影响(在一个页面上有不同的导航,因为您忘记更新它会导致糟糕的用户体验,从而对您的网站/公司/任何)。
使用缓存也无济于事——缓存代码会比仅仅使用 include() 更慢。缓存对您有益的唯一情况是您正在执行计算密集型计算(非常罕见,在网页上)或从数据库中获取数据。
【讨论】:
听起来您正在参与一些过早的优化。如果未构建应用程序,虽然需要注意性能问题,但您主要关心的应该是编写应用程序。
包含是生活中的事实。不用担心数量,担心保持代码井井有条(PEAR 文件夹结构是个不错的东西,如果您不知道我在说什么,请查看 Zend Framework 类文件的结构)。
专注于以合理的抽象量编写应用程序。将所有数据库调用分组到一个类(或多个类)中,以便最大限度地减少代码重复(KISS 原则和所有),当需要重构和优化查询时,它们位于中心位置。还要开始进行一些单元测试以防止回归。
一旦应用程序启动并运行,不要问我们什么更快或更好,因为它取决于每个应用程序你的瓶颈是什么。结果可能是,即使您有很多包含,您的循环也会占用您的时间,或者其他什么。一旦启动并运行,请使用 XDebug 和 profile your code。查找占用过多时间的代码段,然后进行重构。如果你现在过于关注 include 和 include_once 之间的性能影响,那么当同步运行的 curl 请求正在吃你的早餐时,你最终会陷入困境。
尽管同时,最好的建议是查看 php.net 手册并确保是否有内置函数可以做您想做的事情,使用它! PHP 的基于 C 的扩展总是比你可以编写的任何 PHP 代码更快,你会惊讶于你尝试做的事情有多少已经完成了。
但是,我再次强调这一点,过早的优化是不好的!!!只需让您的应用程序以良好的抽象级别启动,对其进行分析,然后修复实际消耗的内容你的时间,而不是修复你认为可能会占用你时间的东西。
【讨论】:
严格来说,纯 HTML 总是比服务器端方法更快,因为服务器不需要对代码进行任何解释。
要回答更大的问题,有许多因素会导致您的网站陷入困境;当您的代码与 PHP 相比时,没有具体的阈值。 (请记住,雅虎的许多网站都是 PHP 驱动的,所以不要认为 PHP 无法扩展)。
我注意到的一件事是,最慢的 PHP 驱动站点包含的内容超出了显示特定页面所需的内容。 OSCommerce (oscommerce.com) 是最受欢迎的 PHP 驱动的购物车之一。但是,它有一个坏习惯,即在每个页面上都包含所有核心功能(以防万一)。因此,即使您不需要显示“信息框”,也会加载该功能。 另一方面,有许多 PHP 框架(例如 CakePHP、Symfony 和 CodeIgniter)采用“按需加载”的方法。
我建议如下:
【讨论】:
不包括在内,没有什么可担心的。
您可能想考虑在某个时候稍微调整一下您的缓存标头,但除非您获得重大点击,否则应该没问题。假设这都是静态数据,您甚至可以考虑将整个网站转换为静态 HTML(最简单的方法:编写一个脚本,通过网络服务器抓取每个页面并将其转储到匹配的 dir 结构中)
大多数网络应用程序都受到其数据库速度的限制(或者无论它们的外部存储是什么,但 9/10 倍将是数据库),应用程序代码很少引起关注,而且听起来并不就像您正在做任何您需要担心的事情一样。
【讨论】:
在您对如何为您的网站构建代码做出任何长期决定之前,我建议您先阅读一下Model-View-Controller 设计模式。虽然还有其他一些,但这个似乎在 Web 开发圈中获得了很大的进展,并且肯定会存在一段时间。在对哪种设计最适合您的需求做出任何最终决定之前,您可能想看看 Martin Fowler 在他的Patterns of Enterprise Application Architecture 中建议的其他一些设计模式。
根据您项目的规模和范围,您可能希望使用现成的 PHP 框架,例如 Zend Framework 或 PHP On Trax,或者您可能决定构建自己的解决方案。
特别是关于 HTML 内容的呈现,我强烈建议您使用某种形式的模板,以使您的业务逻辑与显示逻辑分开。我发现在我的开发过程中,这条简单的规则在需要更改其中一项时为我节省了数小时的工作时间。我使用过 http://www.smarty.net/">Smarty,我知道大多数框架要么有自己的模板系统,要么提供插件架构,让您可以使用自己喜欢的方法。当您查看可能的解决方案时,我建议您寻找一种能够创建缓存版本的解决方案。
最后,如果您担心后端的速度,那么我强烈建议您研究如何最大限度地减少对后端数据存储(无论是数据库还是系统文件)的调用。尽量避免一次加载和呈现过多的内容(例如存储在包含数百条记录的表中的大型报告)。如果可能的话,想办法让用户界面一次加载更少量的数据。 如果您特别关心 html 内容及其 CSS、Javascript 或其他依赖项的实际加载时间,我建议您查看 Yahoo! 人员的 these suggestions。
【讨论】:
添加 JayTee 提到的内容 - 在需要时加载功能。如果您没有使用任何自动执行此操作的框架,您可能需要查看 PHP5 中引入的 __autoload() 功能 - 基本上,您自己的逻辑可以在您实例化特定类时调用,如果它还没有加载。这使您有机会包含()按需定义该类的文件。
【讨论】: