ThinkPHP的安装运行和调试 - 实践

ThinkPHP的安装运行和调试 - 实践

文章目录环境准备工作PHPXAMPPcomposerxdebugVSCodeThinkPHP安装运行ThinkPHP服务器Apache控制器接口路由调试代码

环境Windows 11 专业版XAMPP 8.2.12

PHP 8.2.12VSCode 1.103.0准备工作PHPPHP和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.ini

Now trying to download from source

In GitDownloader.php line 82:

git was not found in your PATH, skipping source download

create-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] [--] [ [ []]]

可见,缺少 “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\xxx

Mode 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 = true

DB_TYPE = mysql

DB_HOST = 127.0.0.1

DB_NAME = test

DB_USER = username

DB_PASS = password

DB_PORT = 3306

DB_CHARSET = utf8

DEFAULT_LANG = zh-cn

先不用修改它。

运行ThinkPHP服务器在该目录下( think 文件所在目录),启动ThinkPHP自带的服务器:

php think run

确认输出信息里没有报错,然后打开浏览器,访问 http://localhost:8000 ,如下:

说明ThinkPHP已经正确的安装、配置和运行。

注意:下面几个URL是等价的:

http://localhost:8000http://localhost:8000/index.php/ 注意:结尾处必须要有 /http://localhost:8000/index.php/indexhttp://localhost:8000/index.php/index/indexThinkPHP的入口文件是 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 。

ApacheXAMPP自带的Apache服务器,默认配置先不用修改。在浏览器里访问 http://localhost/xxx/public ,效果和上图一样。

同理,下面几个URL是等价的:

http://localhost/xxx/publichttp://localhost/xxx/public/index.php 注意:结尾处可以省略 /http://localhost/xxx/public/index.php/indexhttp://localhost/xxx/public/index.php/index/index控制器接口在上例中,在浏览器里访问 http://localhost:8000 ,实际所访问的后台文件是 C:\xampp\htdocs\xxx\app\controller\Index.php ,其内容如下:

namespace app\controller;

use app\BaseController;

class Index

extends BaseController

{

public function index()

{

return '';

}

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=Tomhttp://localhost/xxx/public/index/hello/name/Tomhttp://localhost/xxx/public/index.php/index/hello?name=Tomhttp://localhost/xxx/public/index.php/index/hello/name/Tom如果不用默认的Index控制器,而是创建一个新的控制器,比如,在同一目录下创建 My.php 文件,内容如下:

namespace app\controller;

use app\BaseController;

class My

extends BaseController

{

public function index() {

return 'aaa';

}

public function foo() {

return 'OK';

}

}

这样,就可以在浏览器里通过

http://localhost:8000/Myhttp://localhost:8000/My/indexhttp://localhost:8000/My/foo来访问它们了。

路由如果是POST请求,或者PHP文件在其它路径,则可通过路由来映射。

在 controller 目录下创建 api 目录,然后在 api 目录创建文件 Test1.php 如下:

namespace 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请求,就会停止在断点处:

这样,就可以单步调试了。

相关推荐

steam游戏f12截图怎么打开 steam上f12的截图保存在哪里
best365提现到账慢

steam游戏f12截图怎么打开 steam上f12的截图保存在哪里

🕒 10-09 👀 6269
剑灵玄武帝BOSS攻略 乌龟打法
365bet体育网站

剑灵玄武帝BOSS攻略 乌龟打法

🕒 08-02 👀 3022