千家信息网

不使用include_once和require_once的原因有哪些

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,本篇内容介绍了"不使用include_once和require_once的原因有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希
千家信息网最后更新 2025年11月09日不使用include_once和require_once的原因有哪些

本篇内容介绍了"不使用include_once和require_once的原因有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

PHP去判断一个文件是否被加载, 是需要得到这个文件的opened_path的, 意思是说, 比如:

复制代码 代码如下:

set_include_path("/tmp/:/tmp2/");
include_once("2.php");
?>


当PHP看到include_once "2.php"的时候, 他并不知道这个文件的实际路径是什么, 也就无法从已加载的文件列表去判断是否已经加载, 所以在include_once的实现中, 会首先尝试解析这个文件的真实路径(对于普通文件这个解析仅仅类似是检查getcwd和文件路径, 所以如果是相对路径, 一般是不会成功), 如果解析成功, 则查找EG(include_files), 如果存在则说明包含过了, 返回, 否则open这个文件, 从而得到这个文件的opened_path. 比如上面的例子, 这个文件存在于 "/tmp2/2.php".

然后, 得到了这个opened_path以后, PHP去已加载的文件列表去查找, 是否已经包含, 如果没有包含, 那么就直接compile, 不再需要open file了.

1. 尝试解析文件的绝对路径, 如果能解析成功, 则检查EG(included_files), 存在则返回, 不存在继续
2. 打开文件, 得到文件的打开路径(opened path)
3. 拿opened path去EG(included_files)查找, 是否存在, 如果存在则返回, 不存在继续
4. 编译文件(compile_file)

这个在大多数情况下, 不是问题, 然而问题出在当你使用APC的时候…

在使用APC的时候, APC劫持了compile_file这个编译文件的指针, 从而直接从cache中得到编译结果, 避免了对实际文件的open, 避免了对open的system call.

然而, 当你在代码中使用include_once的时候, 在compile_file之前, PHP已经尝试去open file了, 然后才进入被APC劫持的compile file中, 这样一来, 就会产生一次额外的open操作. 而APC正是为了解决这个问题, 引入了include_once_override, 在include_once_override开启的情况下, APC会劫持PHP的ZEND_INCLUDE_OR_EVAL opcode handler, 通过stat来确定文件的绝对路径, 然后如果发现没有被加载, 就改写opcode为include, 做一个tricky解决方案.

但是, 很可惜, 如我所说, APC的include_once_override实现的一直不好, 会有一些未定义的问题, 比如:

复制代码 代码如下:


set_include_path("/tmp");
function a($arg = array()) {
include_once("b.php");
}

a();
a();
?>


然后, 我们的b.php放置在"/tmp/b.php", 内容如下:

复制代码 代码如下:

class B {}
?>


那么在打开apc.include_once_override的情况下, 连续访问就会得到如下错误:
Fatal error - include() : Cannot redeclare class

排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点.

你使用include_once,只能证明, 你对自己的代码没信心.
所以, 建议大家, 不要再使用include_once

"不使用include_once和require_once的原因有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 代码 路径 情况 时候 问题 成功 内容 实际 尝试 编译 原因 更多 知识 检查 实用 普通 学有所成 接下来 这样一来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全转账保障 计算机网络技术原理文献 深圳软件开发驻场好不好 坨宝宝互联网科技有限公司 网络安全法规定国家倡导 网络安全工作审查多久 奔驰e260地图数据库不匹配 关于网络安全说法的错误 在服务器上安装打印机 静安区银联网络技术管理方法 sEMG手语数据库 微软企业库数据库访问 云汉芯城互联网科技怎么样 我的世界网易版个人服务器 安庆网络技术有限公司 泰拉瑞亚加入好友一直发现服务器 网络安全参展回执 网络安全和信息化培训邀请函 ftp服务器 文件管理 电大数据库应用技术本科考试 数据库完整性控制有哪些方法 网站放在文件服务器上 互联网科技未来发展前景 英雄联盟每个服务器的区别 护苗2018网络安全课 服务器搭建论坛 特定网络技术转让价目表 龙岗区网络技术转移价格走势 软件开发工具keil的使用 安卓软件开发路线
0