ThinkPHP部署需确保环境、路径、配置三者严丝合缝:PHP≥7.4(8.x需≥8.0.2),强制启用pdo_mysql、mbstring、openssl、json扩展;Web服务器root必须指向public目录并配重写规则;.env须置于项目根目录且APP_ENV未预设时才生效;runtime目录需赋予Web用户读写权限。

PHP版本与核心扩展必须达标
ThinkPHP 6.x 要求 PHP ≥ 7.4,8.x 则强制 PHP ≥ 8.0.2。别只看 php -v 输出,系统里可能有多个 PHP 版本,php 命令软链接常指向旧版,建议用 which php 和 php -i | grep "Loaded Configuration File" 确认实际加载的配置。
以下四个扩展缺一不可,少一个就会在 composer install 或运行时直接中断:
-
pdo_mysql:连接 MySQL 必需,Ubuntu/Debian 上容易漏装,需额外执行
sudo apt install php-mysql - mbstring:处理中文路由、URL 解码、多字节字符串的基础
- openssl:JWT、HTTPS 请求、支付签名等安全功能依赖它
- json:框架配置解析、API 返回、序列化全靠它
验证命令:php -m | grep -E 'pdo_mysql|mbstring|openssl|json'。生产环境建议开启 opcache:opcache.enable=1 且 opcache.validate_timestamps=0(上线后手动 opcache_reset() 清缓存);memory_limit 设为 256M 或更高,避免日志或调试模式下静默崩溃。
Nginx/Apache 必须指向 public 目录并配对重写
ThinkPHP 是单入口框架,所有请求必须经 public/index.php 分发。常见错误是把 Nginx 的 root 写成项目根目录(如 /var/www/myapp),结果导致 404 或直接暴露 app/、config/ 等敏感目录。
立即学习“PHP免费学习笔记(深入)”;
正确做法:
-
root 必须设为
/var/www/myapp/public(不是上层) - Nginx
location /块中用:try_files $uri $uri/ /index.php?$query_string;(比/index.php?s=$uri更兼容 POST 数据) -
fastcgi_param SCRIPT_FILENAME必须用$realpath_root$fastcgi_script_name,否则 symlink 部署时路径会解析失败 - 静态资源加
expires 30d并关闭 access_log,降低磁盘 IO 压力
Apache 用户需启用 mod_rewrite,确保 .htaccess 生效,或在虚拟主机配置中显式允许 AllowOverride All。
.env 文件位置与生效逻辑必须理清
.env 不是“上传就自动起作用”的配置文件,它是环境开关——**仅当 APP_ENV 未被预设时才加载**。如果你在 Nginx 配置里写了 fastcgi_param APP_ENV prod;,或系统级 export APP_ENV=prod,那改了 .env 也完全无效。
关键规则:
-
.env必须放在项目根目录(和think命令同级),不能放config/下,也不能嵌套子目录 - 敏感值含特殊字符(如
@、!、空格)必须用单引号包裹:DB_PASSWORD='p@ss!word' -
DB_HOST生产环境禁用localhost,改用内网 IP(如10.0.1.5),否则 MySQL 会走 socket,权限策略可能不一致
目录权限与 runtime 写入必须保障
框架运行时要动态生成缓存、日志、路由映射等文件。runtime 目录(默认在项目根目录下)必须由 PHP 进程用户(如 www-data 或 nginx)可读写。
常用修复命令(以 Ubuntu + Nginx 为例):
sudo chown -R www-data:www-data runtime-
sudo chmod -R 755 runtime(或更严格地750) -
sudo chown -R www-data:www-data public/static(若启用资源自动编译)
同时务必删除 install.php、README.md 等非必要文件,关闭 debug 模式(app_debug => false),防止敏感信息泄露。



















