include执行php代码,file_get_contents仅返回原始字符串;前者解析执行文件内容,后者原样读取不解析,且支持伪协议和range读取而后者不支持。

include 会执行 PHP 代码,file_get_contents 只返回原始字符串
这是最根本的区别:当你用 include('config.php'),PHP 解析器会把文件内容当作当前脚本的一部分来执行;而 file_get_contents('config.php') 只是把整个文件(包括 <?php 标签、注释、甚至语法错误)原封不动读成一个字符串,不会触发任何解析或执行。
常见错误现象:
- 页面只显示部分文本,PHP 代码段在源码里但没输出 → 很可能是用了
file_get_contents读了含echo的文件,结果只是把echo "hello";当字符串打印出来了 - include 报错 Fatal error: Call to undefined function → 说明被包含文件本身有运行时依赖,且未提前加载
使用场景上:
- 要加载配置、复用逻辑、注入模板 → 用
include或require - 要查看源码、审计内容、做 base64 编码传输、绕过代码执行限制(如 CTF 中读 flag 文件)→ 用
file_get_contents
include 支持路径搜索机制,file_get_contents 不走 include_path
include 默认会按顺序查找:给定的绝对/相对路径 → include_path 配置目录 → 当前脚本所在目录。而 file_get_contents 的 path 参数是严格路径语义,不自动 fallback 到 include_path,除非你显式传入第二个参数 1。
例如:
$content = file_get_contents('config.php', 1); // 这样才会去 include_path 里找
但注意:include_path 对远程 URL 或伪协议(如 php://filter)无效,这些必须写完整路径或协议标识。
容易踩的坑:
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
- 误以为
file_get_contents('common.php')会像include一样自动在./lib/下找到文件 → 实际会报failed to open stream - 在容器或部署环境里修改了
include_path却忘了同步调整file_get_contents的调用方式 → 导致本地能跑、线上找不到文件
file_get_contents 支持伪协议和 range 读取,include 不支持
file_get_contents 底层基于流封装器(stream wrapper),所以能直接用 php://filter、php://input、data:// 等伪协议,还能用 start 和 max_length 参数做偏移读取;include 完全不支持这些,它只认真实存在的可执行文件路径。
典型用法:
- Base64 编码读取敏感文件:
file_get_contents('php://filter/read=convert.base64-encode/resource=flag.php') - 跳过文件头 10 字节:
file_get_contents('log.txt', false, null, 10, 1024) - 读取 POST 原始 body:
file_get_contents('php://input')
而 include('php://filter/...') 会直接失败,解析器不识别该协议用于代码包含。
include 失败是警告或致命错误,file_get_contents 失败只返回 false
include 找不到文件时,默认发 E_WARNING(可继续执行);require 则是 E_COMPILE_ERROR(中断执行)。但 file_get_contents 一律返回 false,不会触发 PHP 错误,需要手动检查返回值。
这意味着:
- 用
include时,如果路径拼错,你马上能看到 Warning;但用file_get_contents时,若忘记判断false,后续操作可能对空字符串处理,导致静默异常 - 某些安全加固环境会禁用
include的远程包含(allow_url_include=Off),但file_get_contents的远程读取(allow_url_fopen=On)可能仍开着 —— 这个差异常被用于绕过限制
真正容易被忽略的是上下文兼容性:比如 file_get_contents 读 HTTPS 资源时,若服务端证书异常,它默认不校验,而 cURL 默认会拒绝;但如果你用 stream_context_create 显式开启 verify_peer,行为又会变严格。这种隐式开关在调试跨环境请求时特别容易漏掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










