65.9K
CodeProject 正在变化。 阅读更多。
Home

PHP:Require/Include 与自动加载器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.23/5 (3投票s)

2015年5月9日

CPOL

2分钟阅读

viewsIcon

17800

PHP:Require/Include 与自动加载器

Google 已经深深地刻在我的脑海里,让我明白处理大量流量时,每一毫秒都至关重要。

在这篇文章中,我将演示一种非常简单的方法来提高你的 PHP 网站性能。这似乎与“老派”的纯 PHP 编写方式背道而驰,但结果令人难以置信!通过移除 requireinclude 的使用,并用 spl_autoload_register 函数代替,节省的时间超过 10 倍!

不仅如此,理论上代码行数也更少!

首先,让我们创建三个基本的 PHP 文件,其中包含空的类定义。它们分别命名为:class1.phpclass2.phpclass3.php。我将它们分组在一个代码列表中,但这些应该分别作为三个独立的文件。

<?php
class Class1 {
}
?>
<?php
class Class2 {
 
}
?>
<?php
class Class3 {
 
}
?>

现在我将创建两个类似的文件。这些文件只是在一个 for 循环中创建这三个新类。我将第一个文件命名为 require.php

<?php
$start = microtime();
 
for ($x = 0; $x < 500; $x++) {
require_once 'class1.php';
require_once 'class2.php';
require_once 'class3.php';
 
$class1 = new Class1();
$class2 = new Class2();
$class3 = new Class3();
}
 
$end = microtime();
?>
<hr/>
Execution Time: <?php echo ($end - $start) ;?> seconds.

第二个文件命名为 autoloader.php

<?php
$start = microtime();
 
spl_autoload_register('autoload');
 
for ($x = 0; $x < 500; $x++) {
$class1 = new Class1();
$class2 = new Class2();
$class3 = new Class3();
}
 
$end = microtime();
?>
<hr/>
Execution Time: <?php echo ($end - $start) ;?> seconds.
 
<?php
/**
* Loads a class.
* @param string $className The name of the class to load.
*/
function autoload($className) {
require_once strtolower($className) . '.php';
}

正如你可能注意到的,唯一的显著区别是在文件的顶部,调用了 spl_autoload_register 来告诉 PHP 如何自动加载类。在这种情况下,我告诉它调用 autoload 函数。该函数对类名执行小写转换,然后包含该文件。

重要的是要注意,自动加载类需要一致的命名约定。否则,可以采用另一种方法,使用一个类和一个静态键/值对数组,将所有类名与要包含的相应文件关联起来。

现在是结果的时候了;几篇文章前,我在 Git 上创建并发布了一个速度测试器:https://github.com/endyourif/speedtester

使用这个应用程序,我为每个页面运行了两次,每次 100 次。一旦应用程序完成,它会删除最高和最低的时间,然后计算平均值。

准备好大吃一惊吧。

require.php 文件的平均运行时间为 7 毫秒。

请大家敲鼓!

autoloader.php 文件的平均运行时间为 1 毫秒。

由于所有这些都在本地运行,并且没有进行实际处理,因此时间非常短;但是,在这种情况下,速度提高了 7 倍!

摘要

你可能会注意到,在 require.php 文件中,我正在 for 循环内执行 require_once。显然,这不是应该开发的方式。这里的想法是,在典型的代码中,当你拥有多个文件相互包含和引用时,你肯定会尝试多次包含同一个文件。

当发生这种情况时,如上面的演示所示,性能会急剧下降,因为 PHP 会检查该文件是否已经加载过并且存在,而不是简单地确定类是否已经存在。

要下载上述示例中的文件,请查看我的 Git 仓库:https://github.com/endyourif/RequireVsAutloader

© . All rights reserved.