🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一个典型的URL访问规则是(我们以默认的PATHINFO模式为例说明,当然也可以支持普通的URL模式): ~~~ http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...] ~~~ ThinkPHP的应用可以支持切换到命令行访问,如果切换到命令行模式下面的访问规则是: ~~~ >php.exe index.php(或其它应用入口文件) 模块/控制器/操作/[参数名/参数值...] ~~~ 解释下其中的几个概念: | 名称 | 描述 | |-----|-----| | 应用 | 基于同一个入口文件访问的项目我们称之为一个应用。 | | 模块 | 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。 | | 控制器 | 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。 | | 操作 | 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。 | 以上是官方手册里提到的命令行访问介绍。 老杨实践了下,发现有些问题, 首先,看一下我写的例子: ~~~ <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function exec(){ // URL_PATHINFO_DEPR 分割符有bug, $cals = strstr(__INFO__, '~cals~'); $cals = ltrim($cals, '~cals~'); $has_opt = false; if(fasle !== stripos($cals, '+')){ $has_opt = true; }elseif(fasle !== stripos($cals, '-')){ $has_opt = true; }elseif(fasle !== stripos($cals, '*')){ $has_opt = true; }elseif(fasle !== stripos($cals, '/')){ $has_opt = true; } try { $result = eval("return $cals ;"); $this->show("'{$cals}' 的计算结果为:{$result}。"); } catch (Exception $e) { $this->show('公式计算错误:'.$cals.'请检查后重新输入计算式:'); } } } ~~~ 我写了个计算用的方法exec。因为要支持/。我配置里,将URL参数分隔符设为了~ :`'URL_PATHINFO_DEPR'=>'~',`。 然后为了,省略默认模块名Home,我入口写了`define('BIND_MODULE','Home');` 常量。 这时候web访问的效果是: ![计算器](http://box.kancloud.cn/2015-05-18_555938820f87f.png) 然后我就 按手册上写的,先命令行进入cal项目入口。 然后。。。 ![错误1](http://box.kancloud.cn/2015-05-18_5559390fe0a9e.png) ![错误2](http://box.kancloud.cn/2015-05-18_5559394a727f4.png) ![正确](http://box.kancloud.cn/2015-05-18_5559397867122.png) 直到我把 Home模块去掉了,才正确。而且,我试过把入口的绑定去除,加上~Home~都不行。 ╮(╯▽╰)╭,还是得多尝试啊,不能尽信书。 Cli 模式方便我们可以做一些系统任务,比如计划任务啊,本地文件操作之类的。这样可以方便使用TP的好处,当然调试也是问题呢?,报错都是乱码。