极品分享

crontab执行带参数的php脚本

现在越来越喜欢用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带参数的脚本啦!


2018-04-03 0 /
PHP学习
/
标签: 

评论回复

回到顶部