The two most commonly used functions by PHP programmers are require_once and include. Through these two functions, we can use objects such as classes defined in other class libraries. But many people simply use the following code to reference files when including other files in the same directory:
include performance
The code is as follows | Copy code | ||||
|
代码如下 | 复制代码 |
include(realpath(dirname(_FILE_)).DIRECTORY_SEPARATOR.'include.php'); |
The code is as follows | Copy code |
include(realpath(dirname(_FILE_)).DIRECTORY_SEPARATOR.'include.php'); |
In this way we may need to input more, but compared to the previous method which requires the PHP engine to iterate through include_path to find all the names named 'include.php' to find the corresponding object, dirname(__FILE__) Specifying the absolute path will allow the system to quickly locate the corresponding file.
The constant __FILE__ in PHP is actually very similar to AppDomain.CurrentDomain.BaseDirectory in C#. It returns the absolute path of the file where the code currently being executed is located. The function dirname() returns its parent folder path.
Another more efficient and simple way to write is include('./include.php'), which is equivalent to telling the system to find the 'include.php' file in the current path.
代码如下 | 复制代码 |
define('APP_PATH',realpath(dirname(_FILE_))); |
The code is as follows | Copy code | ||||
define('APP_PATH',realpath(dirname(_FILE_)));
|
This is equivalent to adding a global variable to the system to point out the system root directory. When we need to reference a file in a specific path later, we can use the following code:
The code is as follows | Copy code |
include(APP_PATH.DIRECTORY_SEPARATOR.'models'.'User.php'); |
Performance comparison between autoload and include
代码如下 | 复制代码 |
#file:include1.php include 'include2.php'; //@todo something#file:include2.php //@todo something#file:script1.php include 'include2.php'; //@todo something #file:script2.php include 'include1.php'; include 'script1.php' //@todo something |
The code is as follows | Copy code |
#file:include1.php include 'include2.php'; //@todo something#file:include2.php //@todo something#file:script1.php include 'include2.php'; //@todo something #file:script2.php include 'include1.php'; include 'script1.php' //@todo something |
当执行script1.php时, include ‘include2.php’; 这行代码被执行了一次。而执行script2.php时,这行代码被执行了两次。
这里只是一个简单的例子,在实际的项目中,include2.php被include的次数可能更多。这样反复的include,是否会影响性能呢?为此我写了个脚本来测试。
代码如下 | 复制代码 |
#file:SimpleClass.php #file:php_include.php |
当$loop值为1时,脚本耗时约0.00018906593322754秒,当$loop为1000时,脚本耗时约0.076701879501343秒。
如果我们用autoload实现呢?
代码如下 | 复制代码 |
#file:php_autoload.php |
在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒。
但请注意看SimpleClass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?
在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒!效率相差近30倍!
从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能。
至于是否要使用autoload来解放程序员,这就仁者见仁,智者见智了。在我看来,条件允许的前提下,牺牲这一点性能(某些情况下,甚至可能是提升性能)更为便捷的开发,是值得的。
include()和require()性能
对include()来说,在 include()执行时文件每次都要进行读取和评估;
而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句)。
这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高。
另一方面,如果每次执行代码时相读取不同的文件,或者有通过一组文件叠代的循环,就使用include(),
因为可以给想要包括的文件名设置一个变量,当参数为include()时使用这个变量。