最近做数据采集时总会遇到接口执行一段时间之后请求时间过长报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 "结果";}