本地环境跑通第一个Hello World之前,我被"目录该放哪"这个问题卡了整整两天

站长杂谈 28 浏览 0 回复 返回上级

说出来不怕丢人,我刚开始学ThinkPHP那会儿,照着官方文档解压完压缩包,双击了一下public文件夹里的index.php,结果浏览器直接给我下载了个文件。当时我还以为是PHP没装好,重装了两遍WAMP,后来才反应过来:原来PHP项目不是像HTML那样"双击打开"的。

真正让我开窍的,是理解了三个东西的"三角关系"——目录结构、入口文件、运行方式,缺一不可。

一、目录结构不是"看起来整齐"就行

我第一次搭环境的时候,把项目直接扔进了WAMP的www根目录,路径是D:\wamp\www\tp6\public。然后浏览器访问http://localhost/tp6/public/,页面是出来了,但所有CSS和JS全404。F12一看,资源请求都指向了http://localhost/static/...,而不是http://localhost/tp6/public/static/...

问题出在ThinkPHP的URL解析逻辑上。它默认以为你部署在域名根目录,资源路径从根开始算。如果你跟我一样偷懒用子目录放项目,要么配置虚拟主机指向public目录,要么就得去改配置文件里的url_domain_root或者资源路径前缀。我那时候不懂,硬是在每个模板文件里手动加前缀,改到后来自己都忘了哪个改了哪个没改。

后来学乖了,本地开发直接用php内置服务器或者配个虚拟主机,让域名直接指向public目录。Apache的话就是DocumentRoot指向项目路径/public,Nginx的root指令也一样。这一步做对了,后面能少踩80%的路径坑。

二、入口文件那几行代码,我抄了半年才看懂

public/index.php就短短几行,我之前都是直接复制粘贴,从来没想过它在干嘛。直到有一次我手贱把require __DIR__ . '/../vendor/autoload.php';里的../改成了./,整个站直接白屏,报错Class 'think\App' not found

这时候我才去认真看目录层级:

项目根目录/
├── app/ ← 应用代码
├── config/ ← 配置文件
├── public/ ← 唯一对外暴露的目录
│ └── index.php ← 入口:负责加载../vendor/autoload.php
├── route/ ← 路由定义
├── runtime/ ← 缓存日志(需要写权限)
├── vendor/ ← Composer依赖
└── .env ← 环境配置

入口文件的核心任务就两个:一是通过相对路径找到vendor里的autoload.php,把Composer的自动加载机制拉起来;二是实例化App对象并执行。这个../就是从public往上退一级到项目根目录,再进vendor。路径写错,自动加载就崩,后面所有类都找不到。

我还犯过一个蠢:把项目从Windows搬到Linux服务器上,因为大小写不敏感变敏感,App写成app,本地好好的,线上直接500。现在我的习惯是,本地环境尽量贴近线上,包括PHP版本、扩展、甚至操作系统。

三、本地调试环境我试过的三种方案

方案A:php内置服务器(最快上手)

在项目根目录执行php think run,ThinkPHP会自己起一个开发服务器,默认访问http://localhost:8000。这个最省事,适合临时看看效果,但别用来当正式开发环境,因为跟真实服务器的行为还是有差异,比如.htaccess规则不会生效。

方案B:WAMP/XAMPP+虚拟主机(我现在的主力)

配个本地域名比如tp6.test,指向public目录。Windows下改hosts文件加一行127.0.0.1 tp6.test,Apache的vhosts.conf里加一段配置。好处是跟线上环境最接近,可以测伪静态、可以配SSL(虽然本地是自签名证书)、可以多项目并行。缺点是第一次配比较繁琐,我专门写了个记事本模板,新搭项目的时候复制改路径就行。

方案C:Docker(折腾但值得)

后来项目多了,PHP版本冲突严重——老项目要7.2,新项目要8.1。我开始用Docker Compose搭环境,nginx、php-fpm、mysql、redis各一个容器,项目代码挂载进去。docker-compose.yml写一次,换电脑直接docker-compose up。这个学习曲线陡一些,但解决了"我电脑上能跑"的经典难题。

四、一个我现在还在用的检查清单

每次新拉一个项目或者换电脑,我按这个顺序过一遍:

1. php -v确认版本,php -m看扩展(pdo、mbstring、openssl、fileinfo这些ThinkPHP常用)
2. composer install之前先确认composer源,国内建议换阿里云或者腾讯镜像
3. 复制.env.example.env,改数据库配置
4. 确认runtime目录有写权限,Linux下chmod -R 777 runtime(本地偷懒,线上别这么干)
5. 浏览器访问前,先php think看命令行能不能正常出列表,能出说明框架加载没问题
6. 第一次访问看网络面板,确认没有404的资源请求

最后说点感受

我现在回头看,入门阶段最折磨人的往往不是某个具体的技术难点,而是"我不知道我不知道什么"。目录结构看不懂、入口文件报错信息看不懂、浏览器行为和命令行行为对不上——这些"元问题"消耗了我大量时间。后来养成一个习惯:每解决一个坑,就写三行注释在代码里,再记一笔到私人文档。攒了半年,居然成了我最好的入门教材。

你们刚开始搭环境的时候,是被哪个环节卡住的?是Composer装不上,还是虚拟主机配完hosts不生效,又或者是跟我一样双击了index.php?

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