Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

经过测试,require_once是一个性能低下的语法结构,当然,这个性能低下是相对于require而言的,本文阐述我们项目目前使用的require方式,通过实验代码证明其高效性,同时,描述我们在使用过程中遇到的问题,避免他人在同一个石头上绊倒。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

require: 引入一个文件,运行时编译引入.YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

require_once: 功能等同于require,只是当这个文件被引用过后,不再编译引入。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

上面就是两者的区别。可以看出,两者的不同仅在于require_once有一个判断是否已经引用过的机制。通过网络搜索,可以看到很多关于require_once性能比require低很多的数据,这里就不再做这个试验。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

我们项目中的做法是: 在每个文件起始位置定义一个全局变量,require的时候,使用isset($xxxxxx) or require 'xxxxx.php';YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

这种做法有什么不足呢?YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

全局变量以$xxx方式定义的时候,如果该文件在函数内被require,该变量会被解析为函数的局部变量,而不是全局的,因此,函数内部的isset($xxx) or require 'xxx.php'这个语法结构会失效,带来的结果当然是意料不到的,比如,类的重定义,方法的重定义等等。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

前车之鉴,所以,全局变量的定义,请使用$GLOBALS['xxx'],require的时候,使用isset($GLOBALS['xxx']) or require 'xxx.php';,使用GLOBALS会比直接定义稍慢,但总比错是要好很多的。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

由于我们之前的全局变量是直接定义的,今天在和同事讨论的过程中,想到另外一种写法:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

定义的位置仍然使用$xxx方式直接定义,require的方法中进行修改(文件头部定义的全局变量和文件名是有关联的)。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

function ud_require($xxx) {
	global $$xxx;
    isset($$xxx) or require $xxx . '.php';
}

这种方式使用了动态变量,经过和直接的GLOBALS方式比较,有两个显著缺点:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

性能,由于动态变量的引入,比GLOBALS方式慢2倍左右。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

无法解决间接引用问题,因为我们无法预知被间接引用的文件名,也就无法用global去声明那些被间接引用的文件中定义的标记性全局变量了。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了,下面是我对GLOBALS方式的require和require_once的测试:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

require_requireonce.phpYnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php  
function test1($filename) {  
    //pathinfo($filename);  
    isset($filename) or require $filename;  
}  
function test2() {  
    require_once 'require_requireonce_requireonce.php';  
}  
$start = microtime(true);  
while($i    < 1000000) isset($GLOBALS['require_requireonce_require.php']) or require 'require_requireonce_require.php';  
$end = microtime(true);  
echo "不使用方法的isset or require方式: " . ($end - $start) . "<br />/n";  
$start = microtime(true);  
while($j    < 1000000) test1('require_requireonce_require.php');  
$end = microtime(true);  
echo "使用方法的isset or require方式: " . ($end - $start) . "<br />/n";  
$start = microtime(true);  
while($k    < 1000000) test2();  
$end = microtime(true);  
echo "require_once方式: " . ($end - $start) . "<br />/n";  
?>

require_requireonce_require.php (用于测试require的被引入文件)YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php  
$GLOBALS['require_requireonce_require.php'] = 1;  
class T1 {}  
?>

require_requireonce_requireonce.php (用于测试require_once的被引入文件)YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php  
class T2 {}  
?>

下面是测试的结果(单位: 秒):YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

不使用方法的isset or require方式: 0.22953701019287YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

使用方法的isset or require方式: 0.23866105079651YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

require_once方式: 2.3119640350342YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

可以看出,不套一个方法的require速度是比使用方法的略快的,两者速度都是require_once的10倍左右。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

那么,性能损耗究竟在哪里呢?YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

上面require_requireone.php文件中的test1方法中,我注释了一句pathinfo($filename),因为,我本来意图是使用文件名不带后缀作为标记性的全局变量名的,但是,当我使用pathinfo之后,我发现这种方式的性能消耗和require_once基本一致了。因此,我在那里单独的加了一个pathinfo的调用,又做了测试,果然是pathinfo在捣鬼。所以,后面我就修改为了现在的版本,直接使用文件名作为变量名,如果你害怕文件名重复,那不妨加上路径名...YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

猜测: 加上pathinfo之后,require和require_once的性能消耗基本一致,那我们是否可以猜测PhP程序内部对require_once的处理是基于它的呢?据说PhP程序5.3中对require_once做了显著的优化,但是,我测试过程中使用的是PhP程序5.3.5版本,仍然能够看到和require明显的差距,难道只是比之前版本较大优化?这个倒还没有测试....YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

尝试把test1方法做了如下修改:isset($GLOBALS[substr($filename, 0, strlen($filename) - 4)]) or require $filename;YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

使用手动的字符串截取,当然,截取是要耗时的,不过比pathinfo的版本是要好一点的。这次的测试结果是:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

不使用方法的isset or require方式: 0.21035599708557YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

使用方法的isset or require方式: 0.92985796928406YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

require_once方式: 2.3799331188202YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

对于require_once修改为isset or require方式,需要注意以下几方面:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

1、每个文件头部定义唯一的一个标记性变量,使用$GLOBALS['XXX'] = 1;的方式定义,并且,建议变量名是文件名或带路径的文件名(如果单独的文件名会重复)YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

2、定义一个自定义require方法:YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

function ud_require_once($filename) {
	isset($GLOBALS[$filename]) or require $filename;
}


YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

理解PhP程序引用计数和写时复制YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

要理解PhP程序中的内存管理,必须首先理解符号表(symbol table)的思想,变量有两部分�C变量名(如$name)和变量值(如”Fred”)。符号表是一个数组,此数组将变量名映射到其值在内存中的位置。YnTAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,require_once

标签:require_once

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市