thinkphp5、thinkphp6命令行command执行控制器方法
2022-11-24 11:10:29
210
{{single.collect_count}}

最近做数据采集时总会遇到接口执行一段时间之后请求时间过长报404,命令行执行的完美解决这一问题,但之前没做过命令行执行thinkphp方法,找了好多资料,踏了不少坑,终于找到解决方法,下面将代码贴在下面

特别鸣谢这一大神

原文地址:tp5和tp6使用cli(cmd)模式调用控制器 | 时刻需 

tp5

1.command代码如下

<?php/** * Created by 大师兄 * 派系: 神秘剑派 * 技能: zxc * Date: 2021/12/13 * Time: 15:58 * QQ:997823131 * 网址: https://www.shikexu.com */namespace app\common\command;use think\console\Command;use think\console\Input;use think\console\input\Argument;use think\console\input\Option;use think\console\Output;class Action extends Command{protected function configure(){$this->setName("action")->addArgument("route",Argument::OPTIONAL,"请输入路由地址")//路由地址必须输入->addOption('option','o',Option::VALUE_REQUIRED,'设置参数')->setDescription("command 模式来运行控制器方法");}protected function execute(Input $input, Output $output){$Argument = $input->getArguments();if($Argument['command'] == 'action'){if($input->hasOption('option')){$result = action($this->route($Argument['route']),$input->getOption('option'));$output->writeln($result);}else{$result = action($this->route($Argument['route']));$output->writeln($result);}}}public function route($route = ''){if($route){$route = explode("/",$route);$module = isset($route[0])?$route[0]:"index";$controller = isset($route[1]) ? $route[1] : 'index';$action = isset($route[2]) ? $route[2] : 'index';return $module . '/' . $controller . '/' . $action;}return $route;}}

2.然后在application/command.php中添加

"action"=>"app\common\command\Action"

3.使用案例

php think action common/test/index

tp6

1.command代码如下

<?php/** * Created by 大师兄 * 派系: 神秘剑派 * 技能: zxc * Date: 2021/12/13 * Time: 15:58 * QQ:997823131 * 网址: https://www.shikexu.com */namespace app\common\command;use think\console\Command;use think\console\Input;use think\console\input\Argument;use think\console\input\Option;use think\console\Output;use think\Exception;class Action extends Command{protected function configure(){$this->setName("action")->addArgument("route",Argument::OPTIONAL,"your run route path!")//路由地址必须输入->addOption('option','o',Option::VALUE_REQUIRED,'set Controller Argument')->setDescription("Command run Controller Action !");}protected function execute(Input $input, Output $output){$Argument = $input->getArguments();if($Argument['command'] == 'action'){if($input->hasOption('option')){$params = $this->option($input->getOption('option'));$class_fun = $this->route($Argument['route']);$fun = $class_fun['fun'];$result = app("{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}")->$fun($params);$output->writeln($result);}else{$class_fun = $this->route($Argument['route']);// throw new Exception("类".$class_fun['class']);// throw new Exception("方法".$class_fun['fun']);$fun = $class_fun['fun'];$result = app("{$class_fun['app']}\\{$class_fun['module']}\\{$class_fun['controller']}\\{$class_fun['class']}")->$fun();$output->writeln($result);}}}public function route($route = ''){// throw new Exception("路由是".$route);$class_fun['class'] = "app\\index\\controller\\index";$class_fun['fun'] = "index";if($route){$app = "app";$controller = "controller";$route = explode("/",$route);$module = isset($route[0])?$route[0]:"index";$class = isset($route[1]) ? $route[1] : 'index';$fun = isset($route[2]) ? $route[2] : 'index';// $class_fun['class'] = $app."\\".$module."\\".$controller."\\".$class;$class_fun['class'] = $class;$class_fun['fun'] = $fun;$class_fun['module'] = $module;$class_fun['app'] = $app;$class_fun['controller'] = $controller;}return $class_fun;}public function option($option){/* 整理成数组 start */$params = array();$option_arr = explode(",",$option);foreach ($option_arr as $key=>$val){$temp_params = explode("=",$val);$params[$temp_params[0]] = $temp_params[1];}/* 整理成数组 end */return $params;}}

2.在config/sonsole.php中,添加

"action"=>"app\common\command\Action",

3.使用案例

php think action common/test/index --option name=jack,age=10

对应控制器方法

public function index($params=array()){print_r($params);print_r("cmd输出\n");return "结果";}

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}