ThinkPHP部署核心卡点是环境没对齐、入口没暴露、配置没隔离:需严格匹配PHP≥7.4及四大扩展,Nginx root必须指向public目录并配对重写规则,.env须放项目根目录且APP_ENV不可被预设覆盖。

ThinkPHP 部署到服务器不是“丢上去就能跑”,核心卡点往往在三处:**环境没对齐、入口没暴露、配置没隔离**。只要这三点踩准,80% 的线上报错(502、404、DB 连接失败、日志写不进)都能当场排除。
PHP 环境和扩展必须严格匹配 ThinkPHP 6+ 要求
ThinkPHP 6.0+ 强制要求 PHP ≥ 7.4,且 mbstring、json、openssl、pdo_mysql 四个扩展缺一不可——少一个,composer install 就会中断,或者运行时报 Class 'think\Env' not found。
- 用
php -v确认版本,别信系统包管理器的“php”软链接,它可能指向旧版 - 用
php -m | grep -E 'mbstring|json|openssl|pdo_mysql'逐个验证,pdo_mysql特别容易漏(Ubuntu/Debian 上需额外装php-mysql包) - 生产环境务必启用
opcache:opcache.enable=1和opcache.validate_timestamps=0(上线后手动清缓存,别让框架自己轮询) -
memory_limit建议设为256M或更高,尤其开启调试或大量日志时,500 Internal Server Error很可能是内存耗尽静默崩溃
Nginx 必须把 root 指向 public 目录,且重写规则不能错
ThinkPHP 是单入口框架,所有请求必须经由 public/index.php 路由分发。Nginx 配置里 root 写成项目根目录(比如 /var/www/your_project)是常见错误,会导致 404 Not Found 或直接暴露 app/ 目录。
-
root必须是/var/www/your_project/public,不是上层目录 -
location /块里的try_files推荐用try_files $uri $uri/ /index.php?$query_string;(比/index.php?s=$uri&$args更兼容 POST 数据) -
fastcgi_param SCRIPT_FILENAME必须用$realpath_root(不是$document_root),否则 symlink 部署时路径解析会失效 - 静态资源加
expires 30d并关掉access_log,能明显降低 Nginx 日志盘 IO 压力
.env 文件不能上传、不能硬编码、不能靠猜生效
.env 在生产环境不是“可选项”,而是**环境标识开关**:它只在 APP_ENV 未被预设时才加载。一旦你在 Nginx 的 fastcgi_param 或系统 export APP_ENV=prod 里设了值,框架就直接跳过 .env —— 改了文件也完全无效。
-
.env必须放在项目根目录(和think命令同级),不能放config/下,也不能嵌套子目录 - 敏感字段如
DB_PASSWORD含特殊字符(@、!、空格)必须用单引号包裹:DB_PASSWORD='p@ss!word' -
DB_HOST生产环境禁用localhost,改用内网 IP(如10.0.1.5),否则 MySQL 会走 socket,权限策略和网络层行为完全不同 -
APP_DEBUG=false必须写在config/app.php里,而不是只靠.env;.env中的APP_DEBUG=true在生产环境属于高危配置
部署后第一件事:删 runtime 缓存,再验证路由和数据库
本地开发生成的 runtime/ 下的缓存(cache/、log/、temp/)不能直接拷贝到服务器——路径、权限、时间戳全错,轻则 500,重则日志写满磁盘。
立即学习“PHP免费学习笔记(深入)”;
- 上线脚本里加一句:
rm -rf runtime/*,让框架启动时重建干净缓存 - 用
php think route:list检查路由是否加载成功(需确保APP_ENV正确,否则命令行环境和 Web 环境不一致) - 用
php think db:connect测试数据库连通性(ThinkPHP 6.3+ 支持),比手写 PDO 更贴近框架实际行为 - 检查
logs/目录权限是否为www-data:www-data(Ubuntu/Debian)或nginx:nginx(CentOS/RHEL),否则日志写入失败但无提示
APP_ENV 和 .env 的加载时机、runtime 目录的权限继承、fastcgi_param 中 $realpath_root 的必要性——这三个点,90% 的人部署时都只查文档没动手验证,结果花几小时调 502 却卡在路径拼错上。



















