以前一直听说php可以在命令行中运行,但是网上的说明都是一大堆,我今天自己测试了一下,写了一个类,可以调用任意控制器中的方法。
首先,我们要知道几个函数和几个参数:
一个函数:
php_sapi_name() 获取php脚本当前运行环境,如果在浏览器上运行,结果非常多,具体参考一下手册,但是如果是命令行运行这个脚本,结果一般就一个,‘cli’,利用这个特性,我们就可以阻止不是cli运行。因为有的脚本在浏览器中运行非常消耗资源,但是命令行就非常快,这也是为啥我们要用命令行来操作某些类的某些方法的原因。
一个参数:
$argv 命令行模式下参数数组,就是你在命令行输入的东东,都在这个数组里面。
例如:
php D:\phpStudy\WWW\mytest.com\cli2cgi.php test fsindcls
这个命令的意思就是调用php执行D:\phpStudy\WWW\mytest.com\cli2cgi.php
这个文件,同时,传递三个参数进去。
如果我们在cli2cgi.php
写上var_dump($argv),就可以看到如下结果:
看到没,获取到参数了!
那么,接下来就简单了,我们输入类和方法,然后在cli2cgi.php里面拼接文件路径和类名,方法名,然后引用一下,就可以实现在命令行中调用类中的某些方法了!原理就是这么简单。下面上代码:
cli2cgi.php
<?php
// 获取参数,第一为控制器,第二个为方法,第0个为调用的文件路径
// var_dump($argv);
// exit;
$c = $argv[1];
$a = $argv[2];
//拼出类文件路径, 如果a为index crontab_path = index.controller.php
$crontab_path = 'controller/' . $c . '.controller.php';
//引入该文件
require $crontab_path;
//实例化类
$controller = new $c;
//调用该方法
$controller->$a();
test.controller.php
<?php
class test {
public function index() {
echo 'test cgi';
}
public function find() {
if (php_sapi_name() !== 'cli') {
die('nedd cli environment !');
};
echo 'find function' . PHP_EOL;
echo date('Y-m-d H:i:s', time());
}
}
运行命令:
php D:\phpStudy\WWW\mytest.com\cli2cgi.php test find
注意:我在这里把php加入全局环境变量了,所以可以直接调用php。
如是,就出现如下结果: