刚搭好ThinkPHP6环境就踩了入口文件的坑:public/index.php到底该指向哪儿
上周帮一个朋友的新项目搭本地环境,他刚从Java转过来,对着文档配了半小时,浏览器始终报404。我过去一看,Apache的DocumentRoot直接指到了项目根目录,而不是public文件夹。这问题老生常谈了,但新手真的一踩一个准。
我让他改虚拟主机配置,把根目录切到public,顺手解释了为啥ThinkPHP6要把入口文件藏这么深——说白了就是把web可访问和不可访问的代码物理隔开。application、extend、vendor这些目录扔在外面,就算服务器配置抽风,也不会直接暴露源码。他听完来了一句:"Java的WEB-INF也是这个思路,但PHP项目结构太自由,反而没这个意识。"
后来聊深了,发现他对目录职责也糊里糊涂。runtime放缓存和日志,config放配置,route放路由,这些还算直观。但extend和vendor的区别他搞不清,以为都是自己写的代码该放extend,结果把composer拉来的包也往里塞,下次composer update直接覆盖掉。我让他记住一条:凡是composer.json里声明的依赖,装完就老实待在vendor,extend只放你自己写、又不想走composer管理的小模块或者第三方改造过的类库。
本地调试环境我推荐他用PHP内置服务器起步,不是图省事,是减少一层干扰。命令行切到项目根目录,跑php -S localhost:8000 -t public,public当web根目录,router脚本让框架自己处理。遇到最诡异的坑是,他电脑里装了多个PHP版本,终端默认调用的是系统自带的7.2,但项目要求8.0,结果一跑报错全是语法不兼容。最后加了版本管理,用brew切换,项目目录下放个.php-version文件,终端自动识别,才算消停。
IDE调试他一开始配Xdebug配到崩溃,端口冲突、路径映射不对、断点不停,三板斧轮着来。我建议他先别急着上断点,把phpinfo()打出来,确认Xdebug扩展真的加载了,再看IDE里的server配置和项目绝对路径是否对得上。很多新手问题根本不在Xdebug本身,是IDE和PHP进程各说各话。他现在养成了习惯:每次换环境先跑一段php -m | grep xdebug,确认扩展在位,再开IDE。
最后说个我自己的教训。有回本地调试正常,上传测试机就白屏,日志也不写。排查半天,是runtime目录权限问题,www用户没写权限,框架初始化失败,但错误被吞了。后来我在入口文件最上面加了error_reporting(E_ALL); ini_set('display_errors', '1');,本地开发永远开着,线上再关掉。这行代码救过我很多次,尤其是迁移环境的时候,能快速定位是框架没跑起来,还是业务代码抛异常。
新手搭环境,文档看三遍不如亲手踩一遍。但有几个底线建议:入口文件必须锁在public后面,runtime权限别偷懒设777,PHP版本和扩展用命令行确认,IDE调试先验证扩展加载。这几步做到位,后面写业务代码能少一半玄学问题。

