从宝塔一键部署到本地能跑通:我花了一下午才搞懂 ThinkPHP 的入口文件到底在"指"哪儿

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 4 浏览 0 回复

上周帮朋友看一个他接手的二手项目,宝塔面板里站点跑得好好的,下载到本地就是 404。折腾了四个小时,最后发现我连"入口文件"和"目录结构"这两个最基础的概念都没对齐。记录一下,给同样从"会点前端就敢碰全栈"的朋友提个醒。

一、先认门:public 文件夹不是"放静态资源的",它就是门槛

我一开始的习惯是把项目往 phpStudy 的 WWW 根目录一丢,访问 http://localhost/项目名/,结果 ThinkPHP 直接给我甩脸:

No input file specified.

或者更离谱的,直接列出目录结构。后来才搞明白,ThinkPHP 6 的"官方姿势"是把 public 设为运行目录,不是项目根目录。宝塔里站点设置的那个"运行目录"下拉框,选 /public 不是可选操作,是必选项。

本地我用 phpStudy 复刻的时候,得手动改:

站点 → 管理 → 网站目录 → 勾选"运行目录"指向 public

或者干脆配个伪静态,让 Nginx/Apache 把请求都交给 index.php。我抄了一段能用的 Nginx 配置:

location / {
    if (!-e $request_filename){
        rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    }
}

注意那个 ?s=,TP6 其实不需要了,但我老项目混着用,留着也不报错。

二、入口文件里的秘密:别小看那 20 行

public/index.php 我原来以为就是"打个招呼",直到我对比了两个项目的入口文件才发现坑。标准 TP6 长这样:

require __DIR__ . '/../vendor/autoload.php';
$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);

但我那个二手项目,甲方之前找人改过,入口文件里塞了一段自定义的常量定义,还手动 require 了一个 common.php。本地跑的时候,路径用的是绝对路径 /www/wwwroot/xxx/,我 Windows 本地当然炸。

这里学到的:入口文件是第一道关,任何硬编码路径、自定义加载顺序、甚至 php.ini 里没开的扩展(比如我缺的 fileinfo),都会在这里爆。

三、本地环境的"三件套"对齐

我把踩过的坑列了个 checklist,现在新项目先过一遍:

1. PHP 版本:宝塔里显示 7.4,我本地 phpStudy 默认 7.3,某个 str_contains 函数直接 fatal error。现在养成习惯,入口文件里先 phpinfo() 截个图存着。

2. 扩展缺失opensslmbstringpdo_mysql 这三个最常见。最阴的是 fileinfo,不上传文件根本发现不了缺。

3. .env 文件:生产环境有,我 git clone 下来默认带个 .env.example,改了名但数据库密码还是宝塔里的。本地连不上数据库,报错信息又含糊,我一度怀疑是端口问题,结果只是密码不对。

现在我本地 .env 里固定写死一套,加到 .gitignore,再也不提交。

四、一个让我怀疑人生的目录权限问题

Windows 本地调试时,ThinkPHP 的 runtime 目录需要写权限。我项目从宝塔下载下来,压缩包解压后,runtime 文件夹属性带了个"只读"。TP 报错是 Unable to create cache directory,我以为是路径配置错,改了半天 config/cache.php

最后右键 → 属性 → 去掉只读,好了。就……挺无语的。

五、我现在的新手起手式

拿到一个 TP 项目,不再急着改代码,先画个简单的目录地图:

app/ → 业务代码,看 controllermodel 命名规律
config/ → 数据库、缓存、路由配置,先核对本地环境
public/ → 运行入口,确认是不是 web 根目录
route/ → 前后端分离的话,先看 app.php 里的路由定义
runtime/ → 本地先确保可写,上线后记得关 debug

入口文件 public/index.php 逐行读一遍,有没有自定义加载、常量定义、环境判断。

.env 单独复制一份本地版,绝不直接改仓库里的 example。

以上。说出来都是"基础得不能再基础"的东西,但我确实在这一步卡过不止一次。可能老手看会笑,但谁不是从"能跑就行"到"知道为什么能跑"慢慢磨过来的。

评论0
回复 · 0
还没有回复
微信客服 微信客服