ThinkPHP在Linux上部署核心是三步:代码放对位置、Web服务器指向public目录、runtime目录被Web和CLI用户共同可写;90%问题源于这三点未对齐。

ThinkPHP 在 Linux 上不是“安装”,是部署——你不需要运行安装脚本,核心动作只有三件:代码放对位置、Web 服务器指向 public 目录、runtime 目录被 Web 和 CLI 用户共同可写。其他所有问题,90% 都卡在这三点上。
怎么确认 PHP CLI 和 Web 版本一致
很多人执行 php -v 显示 8.2,但网页一打开就报错,原因是 Nginx 背后跑的 PHP-FPM 是另一个版本。必须同时验证两处:
- 终端执行
php -v,输出需 ≥ 8.0(TP8 推荐 8.1/8.2) - 查 PHP-FPM 进程用的二进制:运行
ps aux | grep php-fpm,看路径是否匹配,比如/usr/bin/php-fpm81;再用该路径查版本:/usr/bin/php-fpm81 -v - 缺扩展会静默失败:运行
php -m | grep -E "mbstring|pdo|mysqlnd|openssl|fileinfo",漏一个都可能让路由加载或数据库连接崩掉 - Composer 创建项目时若 CLI 版本低于 8.0,它会自动降级装 TP6,但目录结构一样,
think命令直接报Class 'think\App' not found—— 删干净重来前先 fix PHP 版本
Nginx 配置必须绕开两个坑
配置错一个字符,就会 404 或下载 index.php 源码。关键不是“支持 ThinkPHP”,而是转发逻辑干净:
-
root必须指向项目内public目录,例如root /var/www/myapp/public;,绝不能指到项目根目录 - 删掉或注释掉配置里所有
fastcgi_split_path_info相关行——TP 不依赖它,留着会导致$_SERVER['PATH_INFO']错乱,伪静态失效 - location / 块用最稳写法:
try_files $uri $uri/ /index.php?$query_string;,别抄 Apache 的RewriteRule风格 - 确保
index.php文件本身对 Nginx 用户(如www-data或nginx)可读,否则连入口都打不开
runtime 权限为什么总出问题
设成 755 还是 775 不是玄学,是用户组权限博弈:
立即学习“PHP免费学习笔记(深入)”;
- 先查 Nginx 工作进程用户:
ps aux | grep nginx | head -1(Ubuntu 多为www-data,CentOS 多为nginx) - 再查 PHP-FPM 配置里的
user和group(路径如/etc/php/*/fpm/pool.d/www.conf),必须和 Nginx 用户一致或同组 - 执行:
chgrp www-data runtime && chmod 775 runtime && chmod g+s runtime——g+s确保新生成的子目录自动继承组 - 别用
777:runtime/session和runtime/cache里存的是敏感数据,开放过宽等于留后门
env 文件和 think 命令为什么失效
线上跑不起来、命令报错,往往不是框架问题,而是环境加载链断了:
-
.env文件默认被 Git 忽略,上传时极易遗漏;且必须放在项目根目录(和composer.json同级),不能丢进config/ - 执行
php think前必须先export APP_ENV=production,否则它会试图加载开发专用配置,触发被禁用的函数(如proc_open) -
php think clear在生产环境常失败,改用rm -rf runtime/*更可靠;同理,路由缓存删runtime/route.php即可 - 提示
command not found: think?检查是否在项目根目录执行,且think文件有执行权限:chmod +x think
真正卡住人的地方,从来不是 ThinkPHP 本身,而是 Linux 权限模型、PHP-FPM 用户、Nginx 用户、CLI 用户四者之间那一层微妙的读写权限对齐——runtime 目录属主是 www-data,但你用 root 上传后忘了 chown;又或者 Nginx 用 nginx 用户跑,PHP-FPM 却用 www-data,两者对 runtime 的组权限没打通。这些细节不手动验证,只靠“照着教程配”,十次有九次挂。



















