yaf框架学习(7)命令行模式(CLI)

准备

输入命令php -m检查开启的模块里面是否已包含yaf

如果没有的话,需要先在php.ini中添加:

extension = yaf
yaf.use_namespace=1

yaf在命令行模式下运行, 有两种方式, 第一种方式专门为用Yaf开发Contab等任务脚本设计的方式, 这种方式下, 对Yaf的唯一要求就是能自动加载所需要的Model或者类库, 所以可以简单的通过Yaf_Application::execute来实现。

第二种方式, 是为了在命令行下模拟请求, 运行和Web请求一样的流程, 从而可以用来在命令行下测试我们的Yaf应用, 对于这种方式, 唯一的关键点就是请求体, 默认的请求是由yaf_application实例化, 并且交给yaf_dispatcher的, 而在命令行模式下, Yaf_Application并不能正确的实例化一个命令行请求, 所以需要变更一下, 请求需要手动实例化。

第一种方式

由于该文件不需要被http访问,所以无需放在public目录下,直接在项目根目录新建cli.php,内容如下:

<?php
/*
 * cli命令行
 * 此文件不允许http方式访问
 */
if(php_sapi_name()!='cli'){
    echo 'No authority';exit();
}
define('ENVIRONMENT', 'develop');  //生成环境请修改为product
define('ROOT_PATH', dirname(__FILE__));
define('CONF_PATH', ROOT_PATH . '/conf/app.ini');

$app = new Yaf\Application( CONF_PATH);
$app->execute("main");
function main() {
    echo "hello\n";
}

测试

在命令行中cd到项目录下,然后输入:

php cli.php

第二种方式

更常用的是第二种方式。
由于该文件不需要被http访问,所以无需放在public目录下,直接在项目根目录新建cli.php,内容如下:

<?php
/*
 * cli命令行
 * 此文件不允许http方式访问
 */
if(php_sapi_name()!='cli'){
    echo 'No authority';exit();
}
define('ENVIRONMENT', 'develop');  //生成环境请修改为product
define('ROOT_PATH', dirname(__FILE__));
define('CONF_PATH', ROOT_PATH . '/conf/app.ini');

switch (ENVIRONMENT) {
    case 'develop':
        error_reporting(E_ALL &  ~E_NOTICE);        //报告所有的错误,但除了E_NOTICE这一种
        ini_set('display_errors', 1);
        ini_set('yaf.environ', 'develop');
        break;
    case 'product':
        ini_set('display_errors', 0);
        break;
    default:
        header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
        echo 'The application environment is not set correctly.';
        exit(1); // EXIT_ERROR
}
$app = new Yaf\Application( CONF_PATH);
//加载cli的bootstrap配置内容
$app->bootstrap();

//获取argv参数
$uri_r = explode('/',$argv[1]);
$count = count($uri_r);
if($uri_r[2]){
}elseif($uri_r[1]){
    array_unshift($uri_r,'index');
}else{
    echo 'uri error!';exit();
}
list($module,$controller,$action) = $uri_r;
$params = array_slice($argv,2);

//改造请求
$Request = new Yaf\Request\Simple('CLI',$module,$controller,$action,$params);

//启动
$app->getDispatcher()->dispatch($Request);

目录结构如下图:

测试

在命令行中cd到项目录下,然后输入:

php cli.php index/index

发表评论

邮箱地址不会被公开。 必填项已用*标注