include_once 比 include 多一次路径规范化和哈希查找,通过全局哈希表 eg(included_files) 判断是否已加载;性能差异极小(纳秒级),仅在高频调用、大量不同路径、低配环境才明显,盲目替换易致函数重定义错误。

include_once 每次都要查已加载文件列表
是的,include_once 比 include 多一次路径规范化 + 哈希查找操作。PHP 内部维护一个全局哈希表 EG(included_files),每次调用 include_once 时,它会把目标文件的绝对路径(经 realpath() 处理)作为 key 去查这个表。如果命中,直接返回 true 并跳过加载;否则才执行实际包含逻辑,并把路径写入表中。
这意味着:即使你确定某个文件只会出现一次(比如入口脚本里统一加载 config.php),include_once 仍会多走一遍查找流程——而 include 完全跳过这步。
性能差异在真实项目中通常可忽略
单次调用的开销极小,现代 PHP(7.4+ / 8.x)下,这个查找平均耗时在纳秒级。你很难在压测中观察到明显差距,除非满足以下全部条件:
- 高频调用(如循环内、每请求数百次以上)
- 大量不同路径(导致哈希表膨胀、冲突增多)
- 运行在低配环境(如嵌入式或旧版 PHP 5.6)
更关键的是:多数瓶颈不在这里,而在文件 I/O、解析器开销、或被包含文件本身的执行逻辑。盲目替换 include_once 为 include 反而可能引入函数重定义错误。
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
require_once 和 include_once 的性能开销基本一致
两者的查找逻辑完全相同,区别只在错误处理层级:require_once 失败时报 E_COMPILE_ERROR 并中止,include_once 报 E_WARNING 并继续。性能上没有额外差异。
注意:require_once 和 include_once 都比对应非 _once 版本慢,但彼此之间无显著差别。不要因为“require 更严格”就误以为它更重。
容易踩的坑:大小写和符号链接导致重复加载
在 Windows 或 macOS 上,include_once 'Config.php' 和 include_once 'config.php' 可能被当作两个文件(PHP 5+ 已修复路径归一化,但某些符号链接或挂载点场景仍可能绕过)。更隐蔽的是:
-
include_once './config.php'与include_once 'config.php'路径不等价,可能重复加载 - 使用相对路径时,当前工作目录(
getcwd())变化会影响解析结果 -
opcache.enable=1下,_once行为仍生效,但文件内容不会重复编译——这点常被误解为“性能没影响”,其实查找开销仍在
真正要优化性能,优先检查是否真的需要 _once;若确认唯一性,用 include 或 require 更直接。但别为了省几纳秒,放弃对重复定义的防御。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










