PHP 需要数千个文件性能问题
PHP require thousands of files performance issue
我想问一下 php 动态需要数百或数千个文件时的性能。
参见下面的脚本
[文件夹]
产品(50 个文件)
用户(20 个文件)
报告(91 个文件)
每个文件夹都有很多文件,但这些文件为class。下面的示例
class cls_product_01 {
public $db;
function __construct($dbconn){
$this->db = $dbconn;
}
function saveProduct(){
//PS: the saveproduct.ext.php is a normal code (native approach)
require __dir__ .'/product/saveproduct.ext.php';
}
}
我有一个简单的控制器,可以根据 ajax 参数
动态调用 class
$newAjaxClass = 'cls_'. $_POST['actionid'];
$newApp = new $newAjaxClass($dbconn);
我想通过循环请求每个文件夹中的所有 ajax 文件。
由于有很多文件,这会降低网站速度吗?
PS: 由于难以维护以前开发人员的代码,我正在重写此代码。
问题:考虑到这种方法,如果我从头开始 load/required 所有文件,应用程序会变慢吗?这类似于自动加载,但我有点犹豫,如果包含很多文件会变慢(吃很多ram)在这个过程中。特别是,我可能会包括所有文件夹中的大约 300 到 400 个文件。
我知道使用 _autoload 可以使这更容易,因为它会动态加载依赖项。最大的问题是对这些大量脚本使用自动加载会减慢应用程序的速度吗?有了那一百个文件,自动加载会占用多少 RAM?
检查自动加载。
http://php.net/__autoload
基本上,如果你告诉它如何知道在哪里找到文件,给定 class 名称,那么你不需要预先全部要求它们。
您可以使用 spl_autoload_register()
.
spl_autoload_register(function ($class_name) {
include $class_name . '.class.php';
});
http://php.net/manual/en/language.oop5.autoload.php
这是延迟加载,因此除非需要,否则不会预先包含所有文件。
例如,如果您要加载 cls_product_01
,调用:
new `cls_product_01();`
将查找文件 cls_product_01.class.php
并将其包括在内。但是你的情况看起来很麻烦,我认为你真的需要再次考虑你的设计。而且我不认为根据用户提供的数据包含文件是个好主意。 [喜欢$newAjaxClass = 'cls_'. $_POST['actionid'];
]
希望对您有所帮助。
我想问一下 php 动态需要数百或数千个文件时的性能。
参见下面的脚本
[文件夹]
产品(50 个文件)
用户(20 个文件)
报告(91 个文件)
每个文件夹都有很多文件,但这些文件为class。下面的示例
class cls_product_01 {
public $db;
function __construct($dbconn){
$this->db = $dbconn;
}
function saveProduct(){
//PS: the saveproduct.ext.php is a normal code (native approach)
require __dir__ .'/product/saveproduct.ext.php';
}
}
我有一个简单的控制器,可以根据 ajax 参数
动态调用 class$newAjaxClass = 'cls_'. $_POST['actionid'];
$newApp = new $newAjaxClass($dbconn);
我想通过循环请求每个文件夹中的所有 ajax 文件。 由于有很多文件,这会降低网站速度吗?
PS: 由于难以维护以前开发人员的代码,我正在重写此代码。
问题:考虑到这种方法,如果我从头开始 load/required 所有文件,应用程序会变慢吗?这类似于自动加载,但我有点犹豫,如果包含很多文件会变慢(吃很多ram)在这个过程中。特别是,我可能会包括所有文件夹中的大约 300 到 400 个文件。
我知道使用 _autoload 可以使这更容易,因为它会动态加载依赖项。最大的问题是对这些大量脚本使用自动加载会减慢应用程序的速度吗?有了那一百个文件,自动加载会占用多少 RAM?
检查自动加载。 http://php.net/__autoload
基本上,如果你告诉它如何知道在哪里找到文件,给定 class 名称,那么你不需要预先全部要求它们。
您可以使用 spl_autoload_register()
.
spl_autoload_register(function ($class_name) {
include $class_name . '.class.php';
});
http://php.net/manual/en/language.oop5.autoload.php
这是延迟加载,因此除非需要,否则不会预先包含所有文件。
例如,如果您要加载 cls_product_01
,调用:
new `cls_product_01();`
将查找文件 cls_product_01.class.php
并将其包括在内。但是你的情况看起来很麻烦,我认为你真的需要再次考虑你的设计。而且我不认为根据用户提供的数据包含文件是个好主意。 [喜欢$newAjaxClass = 'cls_'. $_POST['actionid'];
]
希望对您有所帮助。