• yaf中使用Cli模式,也就是定时器


    CLI 模式与 Web 模式的区别:

    • CLI 其输出没有任何头(Header)信息。
    • 出错时输出纯文本的错误信息(非 HTML 格式)。
    • 所有来自 print 和 echo 的输出将被立即写到输出端。而不作任何缓冲操作。
    • 最大运行时间(max_execution_time)被设置为无限值。
    • $argc$argv 两个变量总是存在。并且携带了参数个数与实际的参数数组值。
    • CLI SAPI 不会将当前目录改为已运行的脚本所在的目录。
    • CLI 模式提供了几个专用常量:STDIN、STDOUT、STDERR。

    如何使用?

    public下面放一个cli.php

    <?php
    /**
     * 命令行运行入口文件。
     */
    
    use fingerApp;
    
    error_reporting(0);
    define('TIMESTAMP', time());
    ini_set('default_socket_timeout', -1);
    define('APP_PATH', dirname(dirname(__FILE__)));
    
    require(APP_PATH . '/vendor/autoload.php');
    require(APP_PATH . '/config/api_constants.php');
    
    $app = new Yaf_Application(APP_PATH . "/config/api.ini", 'conf');
    // 根据是否存在 .env 进行配置文件的加载。
    if (file_exists('../.env')) {
        $cfgObj = new Yaf_Config_Ini('../.env', '');
        $config = $cfgObj->toArray();
    } else {
        $config = $app->getConfig()->toArray();
    }
    (new App($config));
    $app->bootstrap();
    
    
    if (!isset($argv[1])) {
        exit("Please enter the route to execute. Example: the php cli.php Index/Index!
    ");
    }
    
    $routeArr = explode('/', $argv[1]);
    if (count($routeArr) != 2) {
        exit("Please enter the route to execute. Example: the php cli.php Index/Index!
    ");
    }
    
    $controllerName = $routeArr[0];
    $actionName     = $routeArr[1];
    
    // 删除路由参数。
    unset($argv[0], $argv[1]);
    $params = [];
    if (isset($argv[2])) {
        parse_str($argv[2], $params);
    }
    
    $request = new Yaf_Request_Simple('CLI', 'Cli', $controllerName, $actionName, $params);
    Yaf_Application::app()->getDispatcher()->returnResponse(true)->dispatch($request);
    

    控制器位置

    判断是否是cli模式

    <?php
    /**
     * Cli 模式专用 Controller。
     */
    
    namespace Commoncontrollers;
    
    use fingerApp;
    use fingerCore;
    
    class Cli extends Common
    {
        /**
         * 重写父方法, Cli 模式关闭模板渲染。
         * @return void
         */
        public function init()
        {
            parent::init();
            $this->end();
            if (!App::isCli()) { // 非 CLI 模式运行则报错。
                Core::exception(STATUS_SERVER_ERROR, '不是 Cli 模式');
            }
        }
    }
    

    具体的控制器

    <?php
    /**
     * 短信定时器和常驻进程。
     */
    
    use ServicesSmsConsume;
    
    class SmsController extends CommoncontrollersCli
    {
        /**
         * 短信发送消费常驻进程。
         *
         * -- 进入项目根目录下的 public 文件夹,然后如下方式启动:
         * -- $ php cli.php Sms/send
         * 
         */
        public function sendAction()
        {
            echo "sms".PHP_EOL;
        }
    }
    

    操作

     /usr/local/php7.2/bin/php cli.php Sms/send
    
  • 相关阅读:
    [Maven实战-许晓斌]-[第二章]-2.2基于UNIX系统安装maven
    [Maven实战-许晓斌]-[第二章]-2.1在Windows上安装maven
    【sonar-block】Use try-with-resources or close this "BufferedInputStream" in a "finally" clause.
    sonar阻断级别错误(block)简单汇总
    让子类使用父类的Logger
    集合的addAll方法--list.addAll(null)会报错--java.lang.NullPointerException
    nice
    ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
    Ubuntu 系统修改root密码后,无需密码亦可登录
    MySQL 查找今年的数据
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/12111753.html
Copyright © 2020-2023  润新知