准备
输入命令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