Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套PHP是否包括CPU/内存密集型?_Php_Mysql_.htaccess_Include_Cpu Usage - Fatal编程技术网

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

嵌套PHP是否包括CPU/内存密集型?,php,mysql,.htaccess,include,cpu-usage,Php,Mysql,.htaccess,Include,Cpu Usage,我正在用PHP编写一个站点,并通过将所有请求定向到一个index.PHP文件(使用.htaccess)来获取“漂亮的URL”(也隐藏我的目录)。然后索引文件解析uri并包含请求的文件。这些文件中还包含多个包含项,每个包含项都可能打开一个MySQL连接。然后这些文件也包含打开sql连接的include。它下降到大约3-4级 这个过程是CPU和内存密集型的,无论是从PHP包含还是在每个包含的文件中打开(和关闭)MySQL连接 另外,使用纯htaccess的漂亮URL会使用更少的资源吗?这取决于MyS

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

这个过程是CPU和内存密集型的,无论是从PHP包含还是在每个包含的文件中打开(和关闭)MySQL连接


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

这取决于MySQL客户机代码,我知道,当使用相同的参数打开MySQL连接时,连接通常会被重用


就我个人而言,我只会初始化前端控制器(index.php文件)中的数据库连接,因为所有内容都应该通过它。

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

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

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

  • 如果您使用专用主机/VM,那么您可能会使用mod_php+Xcache或equiv,答案是:不,它不会真正影响运行时,因为所有内容都在php操作码级别缓存在内存中
  • 如果您使用共享托管服务,那么它将影响性能,因为任何PHP脚本都将通过PHP cgi加载,可能是通过SUPPP加载的,并且每个请求都需要读入并编译包含的整个源层次结构。更糟糕的是,在共享解决方案中,如果此请求是1分钟内的第一个请求,则服务器文件缓存将被刷新,封送此源将涉及大量物理I/O=秒时间延迟
我管理了几个phpBB论坛,发现通过聚合共享主机实现的公共include层次结构,我可以将用户响应时间缩短一半。这里有一些文章更详细地描述了这一点()。引用一篇文章:

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

  • 20–40。如果文件系统缓存未启动,每秒可以打开和读取的文件数
  • 1500–2500。如果文件系统缓存中包含文件的内容,则每秒可以打开和读取的文件数
  • 300000–400000。PHP解释器每秒可以编译的行数
  • 20000000。PHP解释器每秒可以解释的PHP指令数
  • 500-1000。PHP解释器每秒可以调用的MySQL语句数,前提是数据库缓存中有您的表内容
有关更多信息,请参见哪里可以复制基准以自行运行

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

$db = AppDB::get();
返回此对象。这是便宜的,因为它是一个包含六个PHP操作码的内部调用

另一种传统的方法是使用一个全局对象来保存对象,只需执行

global $db;
在任何需要使用它的函数中

小型应用的脚注 您建议将所有包含合并到一个包含文件中。这对于稳定生产来说是可以的,但是在测试过程中会出现疼痛。我能提出一个简单的折衷方案吗?将它们分开进行测试,但允许加载单个复合材料。您可以分两部分来完成这项工作(i)我假设每个include定义了一个函数或类,因此为每个include使用一个标准模板,例如

if( !function_exists( 'fred' ) ) {
    require "include/module1.php";
}
在主脚本中进行任何加载之前,请执行以下操作:

@include "include/_all_modules.php";
这样,当您进行测试时,您将删除
\u所有模块.php
,脚本将返回到加载单个模块。当您高兴时,可以重新创建
\u all\u modules.php
。您可以通过一个简单的“release”脚本在服务器端执行此事件,该脚本执行

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

这样,你可以两全其美

这是一个很好的观点。通过使用
.htaccess
和PHP检查和解析来确定要包含哪些内容,您实际上是在两个不同的位置执行相同的作业两次。这将使您的代码更难维护。谢谢。那么,在整个请求过程中,我将只保持一个连接处于打开状态。不完全是这样,如果您使用-X选项选择apache2,那么您将看到处理.htaccess需要约2毫秒。在共享主机服务(通常基于suPHP)上仅使用
需要约100毫秒。
.htaccess
打开一个用户文件,PHP通常会打开几十个。感谢您的详细回复!我在一个共享的环境中。虽然你链接到的文章似乎比我需要的信息多得多,但我从中得到的是,我应该使用更少的包含,简化包含文件中的内容,并在整个请求过程中使用一个连接。谢谢Yves,MySQL连接上的+1。我还添加了一个精简的建议,用于聚合您可能会感到舒服的包含。