ThinkPHP 7.0 要求 PHP ≥ 8.1.0,且必须启用 pdo、mbstring、openssl、curl 四个扩展;PHP 版本低于 8.1 或缺失任一扩展均导致启动失败,无法进入框架初始化流程。

ThinkPHP 7.0 要求 PHP 8.1+,低于该版本会直接启动失败,不是报错而是根本进不了框架初始化流程。
PHP 版本必须 ≥ 8.1.0
TP 7.0 是首个强制依赖 PHP 8.1 的 ThinkPHP 主版本,它大量使用了 PHP 8.1 引入的特性:枚举(enum)、never 返回类型、final 类默认继承限制、以及更严格的联合类型解析逻辑。哪怕只用 php -v 查到是 8.0.30,也会在 vendor/topthink/framework/src/think/App.php 加载时触发 Fatal error: Uncaught Error: Class "MyEnum" not found 或直接卡在 Attribute 解析阶段。
实操建议:
- 运行
php -v确认 CLI 使用的 PHP 版本——多版本共存时,phpinfo()显示的版本和命令行版本可能不一致 - Ubuntu/Debian 下用
update-alternatives --config php切换 CLI 默认版本;CentOS/RHEL 用alternatives --config php - 别依赖集成环境(如旧版 XAMPP)自带的 PHP:它们多数仍停留在 7.x 或 8.0,需手动升级或改用 sury.org 源
- Composer 安装时显式指定解释器:
php8.1 /usr/bin/composer create-project topthink/think tp7
四个扩展缺一不可:pdo、mbstring、openssl、curl
TP 7.0 启动第一行就硬校验这四个扩展,缺失任意一个都会在 index.php 执行初期抛出 Fatal error: Uncaught ErrorException: Required extension not loaded: xxx。其中 curl 已从“推荐”升为“必需”,因为 TP 7.0 的内置 HTTP 客户端(think\Http)、配置中心拉取、以及所有官方 SDK(微信、支付宝、钉钉)默认启用 curl 驱动,禁用后连 php think optimize:route 都会因内部请求失败而中断。
立即学习“PHP免费学习笔记(深入)”;
常见错误现象:
-
mbstring缺失 → 路由匹配全乱,/用户/列表解析成/%E7%94%A8%E6%88%B7/%E5%88%97%E8%A1%A8并 404 -
openssl缺失 →php think key:generate直接崩溃,Session 启动时报Unable to generate secure key -
pdo缺失 → 连php think version都执行不了,框架连数据库抽象层都初始化不了
Web 服务器必须正确传递 PATH_INFO
TP 7.0 默认关闭兼容模式(APP_USE_REWRITE=false 已废弃),完全依赖 PATH_INFO 或 REQUEST_URI 解析路由。Apache 必须启用 mod_rewrite 并确保 .htaccess 生效;Nginx 必须在 server 块中使用 try_files $uri $uri/ /index.php?$query_string;,不能只写 fastcgi_pass 就完事。
典型问题:
- Nginx 配置漏掉
$query_string→ 所有带参数的 URL(如/user?id=1)丢失 GET 参数 - Apache 的
AllowOverride None导致.htaccess被忽略 → 全站 404,但首页能打开(因为命中了index.php入口) - Windows IIS 用户必须安装
URL Rewrite模块并导入官方提供的web.config,否则public/下任何子路径全 404
runtime 目录权限与 .env 加载时机
TP 7.0 把环境加载提前到了「框架容器构建前」,.env 文件必须在入口脚本第一行就被读取。如果 runtime/ 不可写,框架连日志文件都建不了,后续所有缓存(路由、配置、模板)全部失效,表现为反复重编译、响应极慢、甚至某些中间件因无法写锁文件而静默跳过。
容易被忽略的点:
-
.env文件编码必须是 UTF-8 without BOM —— Windows 记事本保存的 100% 带 BOM,会导致DotEnv解析失败,DB 配置回退到默认值 -
runtime/目录权限要同时满足 Web 进程用户(如www-data)和 CLI 用户(如ubuntu)可写,否则php think命令和网页访问用的是两套权限上下文 - 修改
.env后必须清空runtime/config/和runtime/cache/,光删runtime/log/没用
最麻烦的其实是 PHP 版本和扩展的组合验证——你得先确认 CLI 的 php -m | grep -E '^(pdo|mbstring|openssl|curl)$' 输出全有,再确保 Web 服务器调用的是同一个 php.ini,最后还得检查 php -i | grep 'Loaded Configuration File' 和 phpinfo() 里显示的路径是否一致。三者稍有偏差,问题就藏得极深。



















