ThinkPHP的安装运行和调试
文章目录
- 环境
- 准备工作
- PHP
- XAMPP
- composer
- xdebug
- VSCode
- ThinkPHP
- 安装
- 运行
- ThinkPHP服务器
- Apache
- 控制器接口
- 路由
- 调试代码
环境
- Windows 11 专业版
- XAMPP 8.2.12
- PHP 8.2.12
- VSCode 1.103.0
准备工作
PHP
PHP和XAMPP二者选一即可。这次我选择了XAMPP。
XAMPP自带了PHP,其路径为: C:\xampp\php\php.exe
。如果安装了独立的PHP,并且添加了路径,在XAMPP环境下,仍然会使用其自带的PHP。在安装ThinkPHP的时候,反而会因为二者版本不一致带来问题。所以,我这次没额外安装PHP,就用XAMPP里的PHP吧。
XAMPP
参见我另一篇文档 https://blog.csdn.net/duke_ding2/article/details/147686647
。
启动Apache,打开浏览器,访问 http://localhost
,确认Apache工作正常,停止Apache。
注:在ThinkPHP的开发阶段,可以用ThinkPHP自带的 php think run
命令启动服务器,不需要Apache服务器。
可以把XAMPP自带的PHP加到路径里。如果不加,在下一步安装composer的时候,它也能找到XAMPP的PHP路径(真是神奇),并且很贴心的提供选项可以把PHP加到路径里。
composer
参见我另一篇文档 https://blog.csdn.net/duke_ding2/article/details/147281321
。
xdebug
参见我另一篇文档 https://blog.csdn.net/duke_ding2/article/details/147281321
和 https://blog.csdn.net/duke_ding2/article/details/147686647
。
这次我下载的文件是 php_xdebug-3.4.5-8.2-ts-vs16-x86_64.dll
,把它放到了 C:\xampp\php\ext
目录下。
注意:该文件版本必须要和PHP版本匹配,否则启动Apache的时候,会报错。
接下来修改 php.ini
文件,添加如下内容:
[xdebug]
zend_extension=C:\xampp\php\ext\php_xdebug-3.4.5-8.2-ts-vs16-x86_64.dll
xdebug.mode = debug
xdebug.client_host = "localhost"
xdebug.client_port = 9003
xdebug.start_with_request = yes
VSCode
参见我另一篇文档 https://blog.csdn.net/duke_ding2/article/details/147281321
。
注:插件只需安装 PHP
即可。
ThinkPHP
安装
在 C:\xampp\htdocs
目录下,运行 composer create-project topthink/think xxx
(其中 xxx
是项目名,可任意命名),报错如下:
PS C:\xampp\htdocs> composer create-project topthink/think xxx
Creating a "topthink/think" project at "./xxx"
Installing topthink/think (v8.1.3)Failed to download topthink/think from dist: The zip extension and unzip/7z commands are both missing, skipping.
The php.ini used by your command-line PHP is: C:\xampp\php\php.iniNow trying to download from sourceIn GitDownloader.php line 82:git was not found in your PATH, skipping source downloadcreate-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--add-repository] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--ask] [--] [<package> [<directory> [<version>]]]
可见,缺少 “zip extension and unzip/7z commands”。解决办法是,在 php.ini
文件里,找到并取消注释以下行:
extension=zip
保存退出。然后再次运行 composer create-project topthink/think xxx
,这次安装成功了。
注意:如果安装了独立的PHP,且放在了Path里,版本和XAMPP的PHP不同,这里可能会报错。所以确保要用XAMPP自带的PHP。
注意:如果composer设置了镜像源,比如阿里云的镜像源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
这里可能会报错404找不到,不知道是什么情况,还是把镜像源切换回官方源吧:
composer config -g repo.packagist composer https://packagist.org
注意:安装失败,重新安装时,要先删除 xxx
目录(如果已存在),否则会报错说目标目录已存在。
安装成功后,在当前目录下多出了 xxx
目录,这就是项目的根目录。进入该目录查看:
PS C:\xampp\htdocs\xxx> ls目录: C:\xampp\htdocs\xxxMode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2025/08/13 星期三 18:14:27 app
d----- 2025/08/13 星期三 18:14:28 config
d----- 2025/08/13 星期三 18:14:27 extend
d----- 2025/08/13 星期三 18:14:27 public
d----- 2025/08/13 星期三 18:14:27 route
d----- 2025/08/13 星期三 18:14:27 runtime
d----- 2025/08/13 星期三 18:14:52 vendor
d----- 2025/08/13 星期三 18:14:27 view
-a---- 2025/07/15 星期二 20:09:14 162 .example.env
-a---- 2025/07/15 星期二 20:09:14 115 .gitignore
-a---- 2025/07/15 星期二 20:09:14 2038 .travis.yml
-a---- 2025/07/15 星期二 20:09:14 1149 composer.json
-a---- 2025/08/13 星期三 18:14:48 37218 composer.lock
-a---- 2025/07/15 星期二 20:09:14 1822 LICENSE.txt
-a---- 2025/07/15 星期二 20:09:14 2037 README.md
-a---- 2025/07/15 星期二 20:09:14 180 think
复制 .example.env
到 .env
,内容如下:
APP_DEBUG = trueDB_TYPE = mysql
DB_HOST = 127.0.0.1
DB_NAME = test
DB_USER = username
DB_PASS = password
DB_PORT = 3306
DB_CHARSET = utf8DEFAULT_LANG = zh-cn
先不用修改它。
运行
ThinkPHP服务器
在该目录下( think
文件所在目录),启动ThinkPHP自带的服务器:
php think run
确认输出信息里没有报错,然后打开浏览器,访问 http://localhost:8000
,如下:
说明ThinkPHP已经正确的安装、配置和运行。
注意:下面几个URL是等价的:
http://localhost:8000
http://localhost:8000/index.php/
注意:结尾处必须要有/
http://localhost:8000/index.php/index
http://localhost:8000/index.php/index/index
ThinkPHP的入口文件是 C:\xampp\htdocs\xxx\public\index.php
,参见官方文档 https://doc.thinkphp.cn/v8_0/entry_file.html
,里面明确说明:
入口文件位置的设计是为了让应用部署更安全,请尽量遵循
public
目录为唯一的web
可访问目录,其他的文件都可以放到非WEB访问目录下面。
所以,访问 http://localhost:8000
,就相当于访问 http://localhost:8000/index.php/
,注意URL结尾处必须要有 /
。
index.php
文件会把请求导向 C:\xampp\htdocs\xxx\app\controller\Index.php
文件,该文件定义了Index类。在上面的URL里,并没有指定Controller以及其方法,默认类是 Index
,默认方法是 index()
方法。所以,其实完整的URL是: http://localhost:8000/index.php/index/index
。
Apache
XAMPP自带的Apache服务器,默认配置先不用修改。在浏览器里访问 http://localhost/xxx/public
,效果和上图一样。
同理,下面几个URL是等价的:
http://localhost/xxx/public
http://localhost/xxx/public/index.php
注意:结尾处可以省略/
http://localhost/xxx/public/index.php/index
http://localhost/xxx/public/index.php/index/index
控制器接口
在上例中,在浏览器里访问 http://localhost:8000
,实际所访问的后台文件是 C:\xampp\htdocs\xxx\app\controller\Index.php
,其内容如下:
<?phpnamespace app\controller;use app\BaseController;class Index extends BaseController
{public function index(){return '<style>*{ padding: 0; margin: 0; }</style><iframe src="https://www.thinkphp.cn/welcome?version=' . \think\facade\App::version() . '" width="100%" height="100%" frameborder="0" scrolling="auto"></iframe>';}public function hello($name = 'ThinkPHP8'){return 'hello,' . $name;}
}
Index控制器是默认的控制器,其中,默认的是 index()
方法。
如果想要访问Index控制器的 hello()
方法,则在URL里控制器不能省略(否则会把 hello
当作控制器而非方法)。当然,URL里的 index.php
是可以省略的。
在浏览器里访问 http://localhost:8000/index/hello?name=Tom
:
注:也可以通过 http://localhost:8000/index/hello/name/Tom
来访问。
同理,如果是通过Apache访问,则URL有以下多种选择:
http://localhost/xxx/public/index/hello?name=Tom
http://localhost/xxx/public/index/hello/name/Tom
http://localhost/xxx/public/index.php/index/hello?name=Tom
http://localhost/xxx/public/index.php/index/hello/name/Tom
如果不用默认的Index控制器,而是创建一个新的控制器,比如,在同一目录下创建 My.php
文件,内容如下:
<?phpnamespace app\controller;use app\BaseController;class My extends BaseController
{public function index() {return 'aaa';}public function foo() {return 'OK';}
}
这样,就可以在浏览器里通过
http://localhost:8000/My
http://localhost:8000/My/index
http://localhost:8000/My/foo
来访问它们了。
路由
如果是POST请求,或者PHP文件在其它路径,则可通过路由来映射。
在 controller
目录下创建 api
目录,然后在 api
目录创建文件 Test1.php
如下:
<?phpnamespace app\controller\api;use think\Request;class Test1 {public function index(Request $request) {return json(['code'=> 200,'msg'=> 'OK']);}
}
在浏览器访问 http://localhost:8000/api/Test1/index
(注意 T
要大写),报错如下:
无法访问,需要做路径映射。
打开 xxx/route/app.php
文件,添加如下内容:
Route::get('api/Test1/index','api/Test1/index');
现在,就可以访问了:
注意:页面右下角的调试图标不见了,这是因为方法里,返回的是 json(['code'=> 200,'msg'=> 'OK'])
。
如果在路径映射里,将其修改为 POST
请求:
Route::post('api/Test1/index','api/Test1/index');
由于在浏览器地址栏里访问的URL是 GET
请求,我们用 curl.exe
命令来访问:
PS C:\xampp\htdocs\xxx> curl.exe --silent -XPOST "http://localhost:8000/api/Test1/index" | jq .
{"code": 200,"msg": "OK"
}
注:这里使用了显式的 curl.exe
而非简写版的 curl
,是因为在PowerShell里,使用的 curl
是 Invoke-WebRequest
的别名,其用法和我们熟悉的curl命令有一些差异,而 C:\windows\system32\curl.exe
的用法和Linux下的curl类似,所以,请确保使用的是后者(或者换成前者的用法)。
注:如果返回值不是JSON,比如是 return 'abc'
,则会输出了非常多的内容,是由于debug打开了,输出内容包含了debug信息。要想关闭debug,编辑项目根目录里的 .env
文件:
APP_DEBUG = false
确保此处设置为false。
如果不想关闭debug,也可以修改代码,令其返回JSON,就不会输出debug信息了。
调试代码
在VSCode中打开 C:\xampp\htdocs
目录。
在最左边点击“Run and Debug”面板,然后点击“create a launch.json”:
会在 C:\xampp\htdocs\.vscode
目录下生成 launch.json
文件如下:
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Launch built-in server and Debug","type": "php","request": "launch","noDebug": false,"runtimeArgs": ["-S","localhost:8000","-t","."],"cwd": "${workspaceRoot}/.","serverReadyAction": {"action": "openExternally"}},{"name": "Launch built-in server and Profile","type": "php","request": "launch","noDebug": true,"runtimeArgs": ["-S","localhost:8000","-t","."],"cwd": "${workspaceRoot}/.","serverReadyAction": {"action": "openExternally"},"profile": true,"openProfile": true},{"name": "Listen for Xdebug","type": "php","request": "launch"}]
}
貌似不用修改,直接保存即可。
在VSCode里添加断点,选中“Listen for Xdebug”,然后点击左边的运行按钮:
再次发送CURL请求,就会停止在断点处:
这样,就可以单步调试了。