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