我正在用PHP编写一个站点,并通过将所有请求定向到一个index.php文件(使用.htaccess)来获得“漂亮的urls”(也隐藏我的目录)。索引文件然后解析uri并包含所请求的文件。这些文件中还有多个包含,每个文件都可以打开一个MySQL连接。然后这些文件也包括在内,这些文件打开sql连接。下降到3-4级。
这个过程是否占用CPU和内存,包括和打开(和关闭)每个包含的文件中的MySQL连接?
另外,使用纯htaccess的漂亮urls会占用更少的资源吗?
发布于 2012-02-14 11:10:24
PHP间接费用
答案是,将应用程序逻辑分解为源层次结构取决于解决方案的托管方式。
我管理了几个phpBB论坛,并发现通过聚合共享主机实现的公共包含层次结构,我可以将用户响应时间减少一半。下面是一些更详细地描述这一点的文章(特里·埃里森[phpBB])。引用一篇文章:
让我用一些大概的数字来量化我的观点。我需要强调的是,以下数字是指示性的。我已经将这些基准测试作为本文的附件,以防您想要在您自己的服务上验证它们。
有关更多信息,请参见更多关于优化PHP融合共享服务中的PHP应用程序的信息,在那里您可以复制基准测试来自己运行。
MySQL连接
这里做的最简单的事情就是把连接集中起来。我使用我自己的mysqli类扩展,它使用标准的每个类的单一对象模板。在我的例子中,任何模块都可以发出一个:
$db = AppDB::get();返回此对象。这很便宜,因为这是一个涉及六个PHP操作码的内部调用。
另一种但传统的方法是使用全局保存对象,然后只执行
global $db;在任何需要使用它的函数中。
适用于小型应用的脚注
您建议将所有包含合并到一个包含文件中。对于稳定的生产来说,这是可以的,但是在测试期间可以使用pain。我能提出一个简单的折衷方案吗?将它们分开进行测试,但允许加载单个组合。您这样做分为两部分(i),我假设每个包含都定义了一个函数或类,所以为每个包含使用一个标准模板。
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' );这样,你就能在这两个世界中发挥最大的作用。
发布于 2012-02-14 09:47:00
这取决于MySQL客户端代码,我知道在打开具有相同参数的MySQL连接时,连接通常会被重用。
就我个人而言,我只会在前端控制器(您的index.php文件)中初始化数据库连接,因为无论如何,一切都应该通过它。
发布于 2012-02-14 09:47:02
您可以使用include_once()或require_once()方法来确保PHP仅解析它们一次,从而节省了处理时间。如果您怀疑您的代码可能试图在每个脚本执行时包含不止一次文件,这将是特别有价值的。
http://php.net/manual/en/function.include-once.php
我可以想象,使用.htaccess解析URL总是比任何其他方法使用更多的资源,纯粹是因为这些规则将在服务器遇到的每个.php文件请求上被激活。
https://stackoverflow.com/questions/9274634
复制相似问题