# 快速入门(十):命令行工具
`ThinkPHP5.0`开始增加了一个命令行工具`think`,并且内置了一些指令,可以帮助开发者在开发或者运维阶段执行一些指令,本章我们来了解下命令行工具的使用和指令开发。
- - [查看指令](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u67E5u770Bu6307u4EE4)
- [生成模块](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u751Fu6210u6A21u5757)
- [生成文件](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u751Fu6210u6587u4EF6)
- [生成类库映射文件](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u751Fu6210u7C7Bu5E93u6620u5C04u6587u4EF6)
- [生成路由缓存文件](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u751Fu6210u8DEFu7531u7F13u5B58u6587u4EF6)
- [指令扩展示例](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u6307u4EE4u6269u5C55u793Au4F8B)
- [命令行调试](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u547Du4EE4u884Cu8C03u8BD5)
- [命令行颜色支持](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u547Du4EE4u884Cu989Cu8272u652Fu6301)
- [调用命令](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/176628#u8C03u7528u547Du4EE4)
## 查看指令
> 命令行工具需要在命令行下面执行,请先确保你的`php.exe`已经加入了系统环境变量。
应用的命令行入口文件是应用根目录的`think`文件,其内容如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 定义项目路径</span>
define(<span class="hljs-string">'APP_PATH'</span>, <span class="hljs-string">'./application/'</span>);
<span class="hljs-comment">// 加载框架命令行引导文件</span><span class="hljs-keyword">require</span> <span class="hljs-string">'./thinkphp/console.php'</span>;
```
```
> 你也可以自定义`think`文件,更改应用目录。
要执行命令,首先进入命令行,并切换当前目录到应用的根目录(也就是`think`文件所在目录)下面,执行:
```
<pre class="calibre18">
```
<span class="hljs-title">php</span> think
```
```
会显示当前支持的所有指令:
```
<pre class="calibre18">
```
>php think
Think Console version <span class="hljs-number">0.1</span><span class="hljs-regexp">Usage</span>:
command [options] [arguments]
<span class="hljs-regexp">Options</span>:
-h, --help Display <span class="hljs-keyword">this</span> help message
-V, --version Display <span class="hljs-keyword">this</span> <span class="hljs-number">console</span> version
-q, --quiet Do <span class="hljs-keyword">not</span> output any message
--ansi Force ANSI output
--<span class="hljs-number">no</span>-ansi Disable ANSI output
-n, --<span class="hljs-number">no</span>-interaction Do <span class="hljs-keyword">not</span> ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity <span class="hljs-keyword">of</span> <span class="hljs-regexp">messages</span>: <span class="hljs-number">1</span> <span class="hljs-keyword">for</span> normal output, <span class="hljs-number">2</span> <span class="hljs-keyword">for</span> more verbose output <span class="hljs-keyword">and</span> <span class="hljs-number">3</span> <span class="hljs-keyword">for</span> debug
Available <span class="hljs-regexp">commands</span>:
build Build Application Dirs
help Displays help <span class="hljs-keyword">for</span> a command
list Lists commands
make
<span class="hljs-regexp">make</span>:controller Create a <span class="hljs-keyword">new</span> controller <span class="hljs-operator"><span class="hljs-keyword">class</span></span><span class="hljs-regexp">make</span>:model Create a <span class="hljs-keyword">new</span> model <span class="hljs-operator"><span class="hljs-keyword">class</span></span>
optimize
<span class="hljs-regexp">optimize</span>:autoload Optimizes PSR0 <span class="hljs-keyword">and</span> PSR4 packages to be loaded with classmaps too, good <span class="hljs-keyword">for</span> production.
```
```
> #### 注意
>
> - - - - - -
>
> 在win10的周年版中运行会出现乱码,请使用`PowerShell`运行。
使用
```
<pre class="calibre18">
```
>php think <span class="hljs-keyword">list</span>
```
```
可以获得相同的结果。
如果输入一个不存在的指令,系统会自动搜索相关的指令并提示,例如:
```
<pre class="calibre18">
```
>php think <span class="hljs-number">make</span>
```
```
会显示
![](https://img.kancloud.cn/ca/bc/cabcd0aa20452d7b39dbd4f6217751b0_507x240.png)
## 生成模块
下面我们给应用生成一个新的模块`test`,首先需要在`application`目录下面创建一个`build.php`定义文件,文件内容如下:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> [
<span class="hljs-comment">// 定义test模块的自动生成</span><span class="hljs-string">'test'</span> => [
<span class="hljs-string">'__dir__'</span> => [<span class="hljs-string">'controller'</span>, <span class="hljs-string">'model'</span>, <span class="hljs-string">'view'</span>],
<span class="hljs-string">'controller'</span> => [<span class="hljs-string">'User'</span>, <span class="hljs-string">'UserType'</span>],
<span class="hljs-string">'model'</span> => [<span class="hljs-string">'User'</span>, <span class="hljs-string">'UserType'</span>],
<span class="hljs-string">'view'</span> => [<span class="hljs-string">'index/index'</span>, <span class="hljs-string">'index/test'</span>],
],
];
```
```
然后在命令行下面,执行:
```
<pre class="calibre18">
```
>php think build
Successed
```
```
如果显示Successed则表示生成成功。
> 注意,命令行指令是区分大小写的,所以如果执行
>
> ```
> <pre class="calibre25">
> ```
> >php think Build
> ```
>
> ```
>
> 会报错。
我们可以看到`application`目录下面已经生成了一个`test`模块目录,包括下面的子目录及文件:
```
<pre class="calibre18">
```
<span class="hljs-regexp">test</span>
├─<span class="hljs-regexp">controller</span>
│ ├─<span class="hljs-regexp">Index</span><span class="hljs-regexp">.php</span>
│ ├─<span class="hljs-regexp">User</span><span class="hljs-regexp">.php</span>
│ └─<span class="hljs-regexp">UserType</span><span class="hljs-regexp">.php</span>
├─<span class="hljs-regexp">model</span>
│ ├─<span class="hljs-regexp">User</span><span class="hljs-regexp">.php</span>
│ └─<span class="hljs-regexp">UserType</span><span class="hljs-regexp">.php</span>
├─<span class="hljs-regexp">view</span>
│ └─<span class="hljs-regexp">index</span>
│ ├─<span class="hljs-regexp">index</span><span class="hljs-regexp">.html</span>
│ └─<span class="hljs-regexp">test</span><span class="hljs-regexp">.html</span>
├─<span class="hljs-regexp">common</span><span class="hljs-regexp">.php</span>
└─<span class="hljs-regexp">config</span><span class="hljs-regexp">.php</span>
```
```
接下来,我们可以访问
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/test/</span>
```
```
会显示:
![](https://img.kancloud.cn/4d/fc/4dfc5f50230f86a15331f1b14ed12833_711x427.png)
我们在`build.php`文件中并没有定义`Index`控制器,但仍然生成了一个默认的`Index`控制器文件以及欢迎页面,这是为了避免模块访问出错。
## 生成文件
还可以用`make`指令单独生成某个应用类库文件,例如:
```
<pre class="calibre18">
```
php think make:controller <span class="hljs-number">test</span>/B<span class="hljs-number">log</span>
```
```
会自动为test模块生成一个 Blog控制器文件。
> 注意,默认生成的控制器类是属于资源控制器,并且继承了\\think\\Controller。
如果希望生成一个空的控制器,可以使用
```
<pre class="calibre18">
```
php think make:controller <span class="hljs-number">test</span>/B<span class="hljs-number">log</span> --plain
```
```
又或者生成一个模型文件
```
<pre class="calibre18">
```
php think make:model <span class="hljs-number">test</span>/B<span class="hljs-number">log</span>
```
```
## 生成类库映射文件
在生成类库文件之后,我们强烈建议使用命令行生成类库映射文件,可以提高自动加载的性能,用法如下:
```
<pre class="calibre18">
```
>php think optimize:<span class="hljs-number">autoload</span>
```
```
执行完毕,会在`RUNTIME_PATH`目录下面生成一个`classmap.php`文件,包括了系统和应用的所有类库文件的映射列表。
## 生成路由缓存文件
如果你的应用定义了大量的路由规则,那么建议在实际部署后生成路由缓存文件,可以免去路由注册的开销,从而改善路由的检测效率,用法如下:
```
<pre class="calibre18">
```
>php think <span class="hljs-string">optimize:</span>route
```
```
执行完毕,会在`RUNTIME_PATH`目录下面生成一个`route.php`文件,包括了应用的所有路由规则定义列表。
> #### 注意
>
> - - - - - -
>
> 路由缓存文件只会缓存在application/route.php文件中配置和动态注册的路由规则,因此请确保你没有在其它的文件中进行路由的注册。
## 指令扩展示例
命令行的作用远不止生成文件这么简单,同时应用也可以很方便的扩展自己的指令,我们来扩展一个用于清理缓存目录的指令`clear`。
> #### 注意
>
> - - - - - -
>
> 最新版本已经内置`clear`指令了,下面的示例可以直接使用内置的`clear`指令进行学习和测试。
首先,我们创建一个指令类 `app\console\Clear`,内容如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">console</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">command</span>\<span class="hljs-title">Command</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">Input</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">input</span>\<span class="hljs-title">Option</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">Output</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Clear</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Command</span></span>{
<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">configure</span><span class="hljs-number">()</span></span>{
<span class="hljs-comment">// 指令配置</span><span class="hljs-regexp">$this</span>
->setName(<span class="hljs-string">'clear'</span>)
->addOption(<span class="hljs-string">'path'</span>, <span class="hljs-string">'d'</span>, Option::VALUE_OPTIONAL, <span class="hljs-string">'path to clear'</span>, <span class="hljs-keyword">null</span>)
->setDescription(<span class="hljs-string">'Clear runtime file'</span>);
}
<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">execute</span><span class="hljs-number">(Input <span class="hljs-regexp">$input</span>, Output <span class="hljs-regexp">$output</span>)</span></span>{
<span class="hljs-regexp">$path</span> = <span class="hljs-regexp">$input</span>->getOption(<span class="hljs-string">'path'</span>) ?: RUNTIME_PATH;
<span class="hljs-regexp">$files</span> = scandir(<span class="hljs-regexp">$path</span>);
<span class="hljs-keyword">if</span> (<span class="hljs-regexp">$files</span>) {
<span class="hljs-keyword">foreach</span> (<span class="hljs-regexp">$files</span> <span class="hljs-keyword">as</span> <span class="hljs-regexp">$file</span>) {
<span class="hljs-keyword">if</span> (<span class="hljs-string">'.'</span> != <span class="hljs-regexp">$file</span> && <span class="hljs-string">'..'</span> != <span class="hljs-regexp">$file</span> && is_dir(<span class="hljs-regexp">$path</span> . <span class="hljs-regexp">$file</span>)) {
array_map(<span class="hljs-string">'unlink'</span>, glob(<span class="hljs-regexp">$path</span> . <span class="hljs-regexp">$file</span> . <span class="hljs-string">'/*.*'</span>));
} <span class="hljs-keyword">elseif</span> (is_file(<span class="hljs-regexp">$path</span> . <span class="hljs-regexp">$file</span>)) {
unlink(<span class="hljs-regexp">$path</span> . <span class="hljs-regexp">$file</span>);
}
}
}
<span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"Clear Successed"</span>);
}
}</span>
```
```
> 一个合法的指令类,没有固定的目录和命名空间要求,但必须继承`think\console\command\Command`或者其子类,并且定义`configure`和`execute`两个方法。
然后,在application目录下面的`command.php`(如果不存在则创建)文件中添加如下内容:
```
<pre class="calibre18">
```
<span class="hljs-number">return</span> [
<span class="hljs-string">'\app\console\Clear'</span>,
];
```
```
表示给应用增加一个命令行`Clear`指令,我们可以用`list`指令来验证是否已经成功注册`Clear`指令:
```
<pre class="calibre18">
```
>php think <span class="hljs-keyword">list</span>
```
```
运行后如果看到
![](https://img.kancloud.cn/c0/c1/c0c1be5a8d3976bd31882fac60c7131c_859x386.png)
表示指令注册成功,接下来可以测试下该指令:
```
<pre class="calibre18">
```
>php think clear
Clear Successed
```
```
> 该指令并不会删除目录,仅仅删除目录下面(包括子目录)的文件。
`clear`指令还定义了一个`--path`参数用于指定目录,下面是一个指定目录删除文件的用法,我们仅仅需要删除日志文件:
```
<pre class="calibre18">
```
>php think clear --path d:\www\tp5\runtime\<span class="hljs-number">log</span>\
Clear Successed
```
```
`--path`参数还有一个简化用法`-d`
```
<pre class="calibre18">
```
>php think clear <span class="hljs-operator">-d</span> d:\www\tp5\runtime\<span class="hljs-number">log</span>\
Clear Successed
```
```
## 命令行调试
命令行一旦执行错误,只能看到简单的错误信息,如果需要调试详细的Trace信息,可以使用 `-v` 参数来显示,例如:
假设Clear指令文件中使用了一个未定义的变量`pathp`,那么我们可以使用
```
<pre class="calibre18">
```
>php think clear
```
```
会显示如下错误:
![](https://img.kancloud.cn/6b/c8/6bc8d6a743de61af507dbb3bb10953a6_327x141.png)
我们需要查看具体的Trace信息,可以使用
```
<pre class="calibre18">
```
>php think clear -v
```
```
会看到类似下面的错误信息:
![](https://img.kancloud.cn/13/16/1316db65bdf92a9375d7298d810389e5_731x355.png)
## 命令行颜色支持
为了让命令行工具更加有趣,`think`命令行支持颜色输出,并且内置了几种颜色样式,还可以自己自定义颜色样式输出。
> #### windows下面命令行颜色输出支持需要`windows 10.0.10580`以上版本支持
我们添加一个`color`指令用于演示颜色输出效果,代码如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">console</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">command</span>\<span class="hljs-title">Command</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">Input</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">Output</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">console</span>\<span class="hljs-title">output</span>\<span class="hljs-title">formatter</span>\<span class="hljs-title">Style</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Color</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Command</span></span>{
<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">configure</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$this</span>
->setName(<span class="hljs-string">'color'</span>)
->setDescription(<span class="hljs-string">'Show Color text'</span>);
}
<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">execute</span><span class="hljs-number">(Input <span class="hljs-regexp">$input</span>, Output <span class="hljs-regexp">$output</span>)</span></span>{
<span class="hljs-comment">// 输出info样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<info>this is info</info>"</span>);
<span class="hljs-comment">// 输出error样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<error>this is error</error>"</span>);
<span class="hljs-comment">// 输出comment样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<comment>this is comment</comment>"</span>);
<span class="hljs-comment">// 输出question样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<question>this is question</question>"</span>);
<span class="hljs-comment">// 输出highlight样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<highlight>this is highlight</highlight>"</span>);
<span class="hljs-comment">// 输出warning样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<warning>this is warning</warning>"</span>);
<span class="hljs-comment">// 输出混合样式</span><span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"this is <info>info</info>, this is <error>error</error>,this is <comment>comment</comment>,this is <question>question</question>,this is <highlight>highlight</highlight>, this is <warning>warning</warning>"</span>);
<span class="hljs-comment">// 自定义输出样式</span><span class="hljs-regexp">$output</span>->getFormatter()->setStyle(<span class="hljs-string">'custom'</span>, <span class="hljs-keyword">new</span> Style(<span class="hljs-string">'black'</span>, <span class="hljs-string">'white'</span>));
<span class="hljs-regexp">$output</span>->writeln(<span class="hljs-string">"<custom>this is style</custom>"</span>);
}
}</span>
```
```
`command.php`定义修改如下:
```
<pre class="calibre18">
```
<span class="hljs-number">return</span> [
<span class="hljs-string">'\app\console\Clear'</span>,
<span class="hljs-string">'\app\console\Color'</span>,
];
```
```
然后执行下面的指令:
```
<pre class="calibre18">
```
>php think color
```
```
运行后就可以看到:
![](https://img.kancloud.cn/85/ea/85ead9f581d1ce03f2fcf512250b6f07_1187x314.png)
## 调用命令
在代码里面可以直接调用执行命令行的某个命令,例如:
```
<pre class="calibre18">
```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Console</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span></span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-comment">// 调用命令行的指令</span><span class="hljs-regexp">$output</span> = Console::call(<span class="hljs-string">'make:model'</span>,[<span class="hljs-string">'index/Blog'</span>]);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$output</span>->fetch();
}
}
```
```
> Console::call方法的第一个参数就是指令名称,后面的第二个参数是一个数组,表示调用的参数。
> 如果我们要创建一个`demo`模块的话,应该是:
>
> ```
> <pre class="calibre21">
> ```
> <span class="hljs-operator"><span class="hljs-title1">Console</span>:<span class="hljs-string">:<span class="hljs-function">call</span>(<span class="hljs-operator">'build'</span>,[<span class="hljs-operator">'--module'</span>, <span class="hljs-operator">'demo'</span>])</span></span>;
> ```
>
> ```
当访问
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com </span>
```
```
页面会输出
```
<pre class="calibre18">
```
<span class="hljs-title">Model</span> created successfully.
```
```
可以在`application/index/model/`目录下面发现已经生成了一个`Blog`模型文件。
当我们再次刷新页面的话,会看到页面输出
```
<pre class="calibre18">
```
Model already <span class="hljs-keyword">exists</span>!
```
```
表示模型已经创建过了,无需再次创建。
> 使用`Console::call`方法调用指令执行不会看到最终的输出结果,需要使用fetch方法获取输出信息,一旦发生错误,则会抛出异常。
- 脕茫隆垄脨貌脩脭
- 脕茫隆垄脨貌脩脭
- 脪禄隆垄禄霉麓隆
- 脪禄隆垄禄霉麓隆
- 露镁隆垄URL潞脥脗路脫脡
- 露镁隆垄URL潞脥脗路脫脡
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脣脛隆垄脢媒戮脻驴芒
- 脣脛隆垄脢媒戮脻驴芒
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脕霉隆垄脛拢脨脥潞脥鹿脴脕陋
- 拢篓1拢漏脛拢脨脥露篓脪氓
- 拢篓2拢漏禄霉麓隆虏脵脳梅
- 拢篓3拢漏露脕脠隆脝梅潞脥脨脼赂脛脝梅
- 拢篓4拢漏脌脿脨脥脳陋禄禄潞脥脳脭露炉脥锚鲁脡
- 拢篓5拢漏虏茅脩炉路露脦搂
- 拢篓6拢漏脢盲脠毛潞脥脩茅脰陇
- 拢篓7拢漏鹿脴脕陋
- 拢篓8拢漏脛拢脨脥脢盲鲁枚
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 戮脜隆垄API驴陋路垄
- 戮脜隆垄API驴陋路垄
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐露镁隆垄脭脫脧卯
- Cookie
- Session
- 碌楼脭陋虏芒脢脭
- 脥录脧帽麓娄脌铆
- 脦脛录镁脡脧麓芦
- 脩茅脰陇脗毛
- 赂陆脗录
- A隆垄鲁拢录没脦脢脤芒录炉
- B隆垄3.2潞脥5.0脟酶卤冒
- C隆垄脰煤脢脰潞炉脢媒
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝