现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多。
比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报表。
但是crontab的传参是个问题,因为命令行下执行php,是不走apache等这类东西的,没有什么http协议,所有get,post传参数根本不起作用,并且还会报错,如下
pakey@ubuntu:~$ php test.php?aaa=bbb Could not open input file: test.php?aaa=bbb
所以就要使用其他方式了,代码如下
<?php print_r($argv); echo "\n"; echo $argc; echo "\n"; ?>
在命令行下执行如下命令,
pakey@ubuntu:~$ php test.php aaa ccc bbbb Array ( [0] => test.php //参数0,文件本身 [1] => aaa //参数1 [2] => ccc //参数2 [3] => bbbb //参数3 ) 4
$argv就是获取到的参数列表 0是文件名 后面的是参数
$arfc则是参数总数 相当于count($argv)
这种传参的方式,根shell脚本真的很像。
那么问题来了,能不能更方便点?获取到的参数以Key-Value形式处理?能否传多个参并且不乱?
可以!
首先,php脚本这样写:
//如果接收到的参数大于0个,则打印出所接收到的参数数组 if($argc > 0) print_r($argv); //对接收到的参数进行Key-Value形式处理,并打印处理后的数组 $options = "n:y:";$opts = getopt( $options );print_r($opts);
然后,在shell或crontab中使用这样方式传参:
/www/abc/test.php -n 2 -y 2018
则输出的结果就是:
Array ( [0] => /www/abc/test.php [1] => -n [2] => 2 [3] => -y [4] => 2018 ) Array ( [n] => 2 [y] => 2018 )
这样就能多个参进行传参并且接收到的是Key-Value形式,方便处理不容易乱。
那么,问题又来了。必须在php脚本预设好要接收了变量名?没有预设就不行啦没办法处理成key-value
难道要每次都编辑脚本增加预设变量名?太麻烦了!真心是心累!有没有解决办法?
解决办法来了!
首先,php脚本这样写:
<?php //定义一个用于处理$argv的方法getClientArgs() function getClientArgs(){ global $argv; array_shift($argv); $args = array(); array_walk($argv, function($v ,$k) use(&$args){ @list($key, $value) = @explode('=', $v); $args[$key] = $value; }); return $args; } //调用方法对接收数据做处理并将结果赋值给新数组变量 $args = getClientArgs(); //打印该数组变量 print_r($args);
然后,在shell或crontab中使用这样方式传参:
/www/abc/test.php id=4 type=1001 age=25 n=2 y=2018 message='hello'
执行结果:
Array ( [id] => 4 [type] => 1001 [age] => 25 [n] => 2 [y] => 2018 [message] => hello )
完美!终于可以愉快的在CLI模式下Shell或crontab处理php带参数的脚本啦!
评论回复