首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套PHP是否包括CPU/内存密集型?

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

Stack Overflow用户
提问于 2012-02-14 09:40:19
回答 3查看 896关注 0票数 4

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

这个过程是否占用CPU和内存,包括和打开(和关闭)每个包含的文件中的MySQL连接?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-14 11:10:24

PHP间接费用

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

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

我管理了几个phpBB论坛,并发现通过聚合共享主机实现的公共包含层次结构,我可以将用户响应时间减少一半。下面是一些更详细地描述这一点的文章(特里·埃里森[phpBB])。引用一篇文章:

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

  • 20-40.如果文件系统缓存没有启动,每秒可以打开和读取的文件数。
  • 1,500–2,500.如果文件系统缓存以其内容开头,则可以每秒打开和读取的文件数。
  • 300,000–400,000.PHP解释器每秒可以编译的行数。
  • 20,000,000PHP解释器每秒可以解释的PHP指令数。
  • 500-1,000.如果数据库缓存以表内容开头,则PHP解释器每秒可以调用的MySQL语句数。

有关更多信息,请参见更多关于优化PHP融合共享服务中的PHP应用程序的信息,在那里您可以复制基准测试来自己运行。

MySQL连接

这里做的最简单的事情就是把连接集中起来。我使用我自己的mysqli类扩展,它使用标准的每个类的单一对象模板。在我的例子中,任何模块都可以发出一个:

代码语言:javascript
复制
$db = AppDB::get();

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

另一种但传统的方法是使用全局保存对象,然后只执行

代码语言:javascript
复制
global $db;

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

适用于小型应用的脚注

您建议将所有包含合并到一个包含文件中。对于稳定的生产来说,这是可以的,但是在测试期间可以使用pain。我能提出一个简单的折衷方案吗?将它们分开进行测试,但允许加载单个组合。您这样做分为两部分(i),我假设每个包含都定义了一个函数或类,所以为每个包含使用一个标准模板。

代码语言:javascript
复制
if( !function_exists( 'fred' ) ) {
    require "include/module1.php";
}

在主脚本中的任何加载简单之前,请执行以下操作:

代码语言:javascript
复制
@include "include/_all_modules.php";

这样,当您进行测试时,您将删除_all_modules.php,脚本将返回到加载各个模块。当你高兴的时候,你可以重新创建_all_modules.php。您可以通过一个简单的“发布”脚本执行此服务器端的事件,该脚本执行

代码语言:javascript
复制
system( 'cp include/[a-z]*.php include/_all_modules.php' );

这样,你就能在这两个世界中发挥最大的作用。

票数 6
EN

Stack Overflow用户

发布于 2012-02-14 09:47:00

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-02-14 09:47:02

您可以使用include_once()require_once()方法来确保PHP仅解析它们一次,从而节省了处理时间。如果您怀疑您的代码可能试图在每个脚本执行时包含不止一次文件,这将是特别有价值的。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9274634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档