zoukankan      html  css  js  c++  java
  • PHP定时任务Crontab结合CLI模式详解

    从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。

    STDIN  标准输入设备
    STDOUT 标准输出设备
    STDERR 标准错误设备
    
    <?php
    
    fwrite(STDOUT,"Enter your name:");
    
    $name = trim(fgets(STDIN));
    
    fwrite(STDOUT,"Hello,$name!
    ");
    
    
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php
    Enter your name:jiqing
    Hello,jiqing!
    

    php在cli模式下接收参数有两种方法。

    1.使用argv数组

    例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, limit=5)

    cli.php

    <?php
    print_r($argv);
    

    在命令行中执行

    php cli.php news 1 100
    

    输出:

    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php news 1 100
    Array
    (
        [0] => cli.php
        [1] => news
        [2] => 1
        [3] => 100
    )
    

    缺点:

    使用argv数组,可以按顺序获取传递的参数。但获取后,需要做一个对应处理,上例中需要把argv[1]对应type参数,argv[2]对应is_hot参数,argv[3]对应limit参数。而如果在传递的过程中,参数顺序写错,则会导致程序出错。

    2.使用getopt方法

    getopt 从命令行参数列表中获取选项

    array getopt ( string $options [, array $longopts ] )
    

    参数:
    options
    该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 “x” 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。

    longopts
    选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(–)传入到脚本的选项。 例如,长选项元素 “opt” 识别了一个选项 –opt。

    options 可能包含了以下元素:
    单独的字符(不接受值)
    后面跟随冒号的字符(此选项需要值)
    后面跟随两个冒号的字符(此选项的值可选)
    选项的值是字符串后的第一个参数。它不介意值之前是否有空格。

    options 和 longopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项),而 options 需要一个字符串(每个字符是个选项)。
    传值的分隔符可以使用空格或=。
    可选项的值不接受空格作为分隔符,只能使用=作为分隔符。

    返回值
    此函数会返回选项/参数对,失败时返回 FALSE。
    选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。

    使用options案例

    a,b,c 为需要值
    d 为可选值
    e 为不接受值

    cli.php

    <?php
    $param = getopt('a:b:c:d::e');
    print_r($param);
    
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a 1
    Array
    (
        [a] => 1
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -b 2
    Array
    (
        [b] => 2
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -c 3
    Array
    (
        [c] => 3
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -d 4
    Array
    (
        [d] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -d=4
    Array
    (
        [d] => 4
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -e 5
    Array
    (
        [e] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -e=5
    Array
    (
        [e] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -b 2 -c 3 -d=4 -e=5
    Array
    (
        [a] => 1
        [b] => 2
        [c] => 3
        [d] => 4
        [e] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -e 2 -c 3 -d=4 -e=5
    Array
    (
        [a] => 1
        [e] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -e 2 -c 3 -d=4 
    Array
    (
        [a] => 1
        [e] => 
    )
    
    

    使用longopts案例

    type,is_hot 为需要值
    limit 为可选值
    expire 为不接受值

    cli.php

    <?php
    $longopt = array (
        'type:',
        'is_hot:',
        'limit::',
        'expire'
    );
    
    $param = getopt('',$longopt);
    print_r($param);          
    
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -type news
    Array
    (
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --type news
    Array
    (
        [type] => news
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot 1
    Array
    (
        [is_hot] => 1
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot=1
    Array
    (
        [is_hot] => 1
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --limit 5
    Array
    (
        [limit] => 
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --limit=5
    Array
    (
        [limit] => 5
    )
    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot 1 --type news --expire 5 --limit=5
    Array
    (
        [is_hot] => 1
        [type] => news
        [expire] => 
    )
    
    

    使用argv数组传参数,方法简单,实现方便。参数的顺序不能错,参数获取后需要做对应处理。
    使用getopt方法,可使用参数名,参数顺序可随意,比较规范。(建议使用)

    另外附上php 执行的一些参数案例

    php -f 运行指定文件

    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php -f cli.php
    hello,world!
    

    这里的f可以省略。

    php -r 直接运行PHP代码

    jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php -r "echo phpversion().PHP_EOL;"
    5.6.31
    

    其他常用命令

    php -m 内置及Zend加载的模块

    php -i 等价于 phpinfo()

    php -i | grep php.ini 查看php配置文件加载路径
    php –ini 同上

    php -v 查看php版本
    php –version 同上

    php –re 查看是否安装相应的扩展 如 php –re gd

    再附上tp框架中cli模式的使用

    在index.php入口文件目录下,新建一个cron.php

    <?php
    if ($_ENV && $_ENV['PHP_ENV'] == 'test') {
        define('APP_DEBUG', true);
    }
    define('APP_NAME', 'Cron');
    define('APP_PATH', '../Cron/');
    define('MODE_NAME','cli');
    define('APP_DEBUG',true);
    // 加载框架入口文件
    require("../ThinkPHP/ThinkPHP.php");
    

    这里只要设置一下

    define('MODE_NAME','cli');
    

    就可以,且必须在命令行下执行了。

    在Cron目录下新建一个TestAction.class.php,内容如下:

    <?php
    /**
     * Created by PhpStorm.
     * User: jiqing
     * Date: 18-4-18
     * Time: 下午3:11
     */
    
    class TestAction extends Action {
        public function hello() {
            echo "hello,world!".date('Y-m-d H:i:s').PHP_EOL;
        }
    }
    

    完了,就可以执行了。

    jiqing@ubuntu:/home/wwwroot/default/5hao/mouse/Public$ php -f cron.php Test/hello
    hello,world!2018-04-18 15:14:13
    

    这里面可以写一些定时任务。使用crontab来定时执行,比如定时处理订单完成,定时分发佣金之类的,或者定时解锁宝箱啥的。

    crontab -e 创建定时任务 crontab -l 查看定时任务

    # m h  dom mon dow   command
    #*/1 *  *   *   *     date >> ~/time.log
    */1 *  *   *   *      cd /home/wwwroot/default/5hao/mouse/Public && php -f cron.php Test/hello >> ~/phptime.log
    

    这个任务的作用就是每隔一分钟执行一次Test下的hello方法,并将输出结果写入phptime.log文件中。

    可以通过tail -f 进行监听,

    jiqing@ubuntu:/home/wwwroot/default/5hao/mouse/Public$ tail -f ~/phptime.log
    hello,world!2018-04-18 15:31:01
    hello,world!2018-04-18 15:32:01
    hello,world!2018-04-18 15:33:01
    hello,world!2018-04-18 15:34:01
    
  • 相关阅读:
    MicroMessage的动态操作(第二步)
    preparement 为什么能防sql注入
    谈MicroMessageTest的开始创建
    关于类的全称什么时候用点什么时候用路径的斜杠
    做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护
    java.sql.Types可以查mysql相关的数据类型
    Navicate一个有用的注册码
    Java中导入、导出Excel
    扁平化
    CentOS-6.5安装配置Tomcat-7
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8875254.html
Copyright © 2011-2022 走看看