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

Yve*_*ves 4 php mysql .htaccess include cpu-usage

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

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

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

Ter*_*ryE 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解释器可以编译的每秒行数.
  • 20,000,000.PHP解释器可以解释的每秒PHP指令数.
  • 500-1,000.如果数据库缓存已准备好您的表内容,则PHP解释器可以调用的每秒MySQL语句数.

有关更多信息,请参阅Webfusion共享服务优化PHP应用程序的更多信息,您可以在其中复制基准测试以自行运行.

MySQL连接

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

$db = AppDB::get();
Run Code Online (Sandbox Code Playgroud)

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

另一种传统的方法是使用全局来保存对象并且只做一个

global $db;
Run Code Online (Sandbox Code Playgroud)

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

小型应用的脚注

您建议将所有包含组合到单个包含文件中.这对于稳定生产来说是可以的,但在测试期间会很痛苦.我可以建议一个简单的妥协吗?将它们分开进行测试,但允许加载单个复合材料.您可以分两部分完成此操作(i)我假设每个include都定义了一个函数或类,因此请为每个include使用标准模板,例如

if( !function_exists( 'fred' ) ) {
    require "include/module1.php";
}
Run Code Online (Sandbox Code Playgroud)

在主脚本中的任何加载简单之前:

@include "include/_all_modules.php";
Run Code Online (Sandbox Code Playgroud)

这样,当您进行测试时,您将删除_all_modules.php并且脚本将回退到加载单个模块.当你开心时,你可以重新创造_all_modules.php.你可以通过一个简单的"发布"脚本来执行此服务器端事务

system( 'cp include/[a-z]*.php include/_all_modules.php' );
Run Code Online (Sandbox Code Playgroud)

这样,您就可以获得两全其美的效果


小智 5

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

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