嵌套PHP是否包含CPU /内存密集型?

时间:2012-02-14 09:40:19

标签: php mysql .htaccess include cpu-usage

我正在使用PHP编写一个站点并通过将所有请求定向到一个index.php文件(使用.htaccess)来获取“漂亮的URL”(也隐藏我的目录)。然后索引文件解析uri并包含请求的文件。这些文件中还包含多个包含的文件,每个文件都可以打开MySQL连接。然后那些文件也包括,哪些打开sql连接。它下降到大约3-4级。

这个过程是CPU和内存密集型,都来自PHP包含和打开(并关闭)每个包含文件中的MySQL连接?

另外,使用纯htaccess的漂亮网址会使用更少的资源吗?

3 个答案:

答案 0 :(得分:6)

PHP开销

答案是将应用程序逻辑分解为源层次结构取决于您的解决方案的托管方式。

  • 如果您使用专用主机/ VM,那么您可能会有mod_php + Xcache或者等效,答案将是:不,它并没有真正触及运行时,因为所有内容都在PHP Opcode级别内存缓存。
  • 如果您使用共享托管服务,那么它影响性能,因为任何PHP脚本都可能通过PHP-cgi加载,可能是通过suPHP,并且需要读入包含的整个源层次结构并根据请求编译 。更糟糕的是,在共享解决方案中,如果此请求是第一个,例如1分钟,则服务器文件缓存将被刷新,并且编组此源将涉及大量物理I / O =秒时间延迟。

我管理了一些phpBB论坛,并发现通过聚合共享托管实现的常见包含层次结构,我可以将用户响应时间缩短一半。以下是一些文章,更详细地描述了这一点(Terry Ellison [phpBB])。并引用一篇文章:

  

让我用一些大概数字来量化我的观点。我需要强调的是,下面的数字是指示性的。我已将基准作为本文的附件包含在内,以防您想在自己的服务上验证它们。

     
      
  • 20-40 即可。如果未准备好文件系统缓存,则每秒可以打开和读取的文件数。
  •   
  • 1,500-2,500 即可。如果文件系统缓存已准备好其内容,则每秒可以打开和读取的文件数。
  •   
  • 300,000-400,000 即可。 PHP解释器每秒可以编译的行数。
  •   
  • 20000000 即可。 PHP解释器每秒可以解释的PHP指令数。
  •   
  • 500-1000 即可。如果数据库缓存已准备好您的表内容,那么PHP解释器可以调用的每秒MySQL语句数。
  •   

有关详细信息,请参阅More on optimising PHP applications in a Webfusion shared service,您可以在其中复制基准以自行运行。

MySQL连接

这里最简单的方法是汇集连接。我使用自己的mysqli类扩展,它使用标准的单对象每类模板。在我的情况下,任何模块都可以发出:

$db = AppDB::get();

返回此对象。这很便宜,因为它是一个涉及六个PHP操作码的内部调用。

另一种传统方法是使用全局来保存对象并执行

global $db;

在任何需要使用它的函数中。

小型应用程序的脚注

您建议将所有包含组合到一个包含文件中。这对于稳定生产来说是可以的,但在测试过程中却是痛苦。我可以建议一个简单的妥协吗?将它们分开进行测试,但允许加载单个复合材料。你可以分两部分来做这些事情(i)我假设每个include都定义了一个函数或类,所以对每个include使用一个标准模板,例如。

if( !function_exists( 'fred' ) ) {
    require "include/module1.php";
}

在主脚本中的任何加载之前,简单地执行:

@include "include/_all_modules.php";

这样,当您测试时,删除_all_modules.php并且脚本会回退到加载单个模块。如果您满意,可以重新创建_all_modules.php。您可以通过一个简单的“发布”脚本执行此服务器端事务,该脚本执行

system( 'cp include/[a-z]*.php include/_all_modules.php' );

通过这种方式,您可以获得两全其美的效果

答案 1 :(得分:5)

这取决于MySQL客户端代码,我知道在打开具有相同参数的MySQL连接时,连接经常被重用。

就个人而言,我只会在前端控制器(你的index.php文件)中初始化数据库连接,因为无论如何一切都应该通过那里。

答案 2 :(得分:1)

您可以使用include_once()require_once()方法确保PHP仅解析它们一次,从而节省处理时间。如果您怀疑每个脚本执行时代码可能会尝试多次包含文件,那么这将特别有用。

http://php.net/manual/en/function.include-once.php

我认为使用.htaccess来解析URL总是会使用比任何其他方法更多的资源,纯粹是因为这些规则会在服务器遇到的每个.php文件请求时激活。