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 finger\App;

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!\n");
}

$routeArr = explode('/', $argv[1]);
if (count($routeArr) != 2) {
    exit("Please enter the route to execute. Example: the php cli.php Index/Index!\n");
}

$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 Common\controllers;

use finger\App;
use finger\Core;

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 Services\Sms\Consume;

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

操作

 /usr/local/php7.2/bin/php cli.php Sms/send
posted @ 2019-12-28 15:16  TBHacker  阅读(802)  评论(0编辑  收藏  举报