无反馈的系统比有反馈效率更高,
这符合unix的哲学:每个命令都很简单然后让他们工作在一起,可以使用管道,或者cron定时任务,自动化我们的工作。或者将你的editplus,vim,emacs,zend等等编辑器同他结合在一起。
批量更新上百台服务器集群里的配置?或者自动化,或者经过N级ssh隧道操作远程系统?命令行才是最具有适应力的交互系统。只有字符才能完全控制计算机。
应用base下面的cmd; 如果是windows,那就是cmd.bat
输入app/base/cmd会进入交互shell模式,或者直接输入某个命令:app/base/cmd xxxx。
你可以使用app/base/cmd help -v看到所有支持的命令列表,-v会显示各个命令所支持的参数。
app/base/cmd help exit 退出 man 显示帮助 sh 执行操作系统命令 mkconfig 创建config文件 ls 列出所有应用 cd 切换当前应用 install 安装应用 uninstall 卸载应用 update 升级应用程序 trace 打开/关闭性能检测 status 显示系统状态 search 在程序库中搜索 createproject 创建新项目 kvrecovery kvstore数据恢复 cacheclean 清除缓存 configcompat config兼容配置检测 应用提供的命令: ------------------------------------------------------- base:queue list 列出所有队列任务 base:queue flush 立即执行所有队列任务 base:queue exec 执行指定的队列任务 base:queue clear //todo 清除所有队列任务 base:queue active //todo 激活某任务 base:queue disable //todo 暂停某任务 base:task list 列出所有计划任务 base:task exec 按计划执行任务 dev:check check //todo 执行代码检查 dev:doc update 执行测试用例 dev:new app 创建一个app dev:project create 创建新项目 dev:show services 显示注册的Service dev:show viewtags 显示所有可用模板标签 dev:show classfile 显示类的文件地址 dev:show depends 生成已安装的app依赖关系图, Graphviz格式 dev:test do 执行测试用例 原生php命令 ---------------------------------------------------------------- 输入命令如果以分号[;]结尾,则被认为是一条php语句. 例如: 1> $a = 2; int(2) 2> pow($a,8); int(256)
app/base/cmd dev:show services | grep "^view_helper" view_helper base_view_helper view_helper ectools_view_helper view_helper desktop_view_helper view_helper b2c_view_helper view_helper site_view_helper
app/base/cmd dev:show depends | dot -Tjpg -odepends.jpg
嗯, 我这里真的装了很多应用 :)
如果你仅仅输入app/base/cmd, 就会进入交互模式:
Ecos shell V1.3 (abort with ^C), Root: /Users/wanglei/Sites/ecstore 1> ls b2c active base active content active dbeav active desktop active dev active ectools active extdb active image active jiankongbao active pam active site active varnish active 2> trace on Trace mode is on 3> cacheclean Cache Clear... ...Clear Success,ok * Command memroy useage = 512, Time left = 0.305762 4> trace off Trace mode is off 5> exit exit
编写一个新命令非常简单,在你的app里创建lib/command目录,然后新建一个文件app/myapp/lib/command/test.php。
<?php
class myapp_command_hello extends base_shell_prototype{
var $command_world = 'Helloworld';
function command_world(){
echo "hello, world\n";
}
}
app/base/cmd myapp:hello world hello, world
当存在同名的command_开头的函数和属性时,函数将作为该命令执行的实体,属性会作为该命令的描述。
使用者空格分割的输入项,将作为该函数的调用参数。
<?php
class myapp_command_hello extends base_shell_prototype{
var $command_3guys = 'Hello 3guys';
function command_3guys($one, $two, $three){
echo "1\t", $one,"\n";
echo "2\t", $two,"\n";
echo "3\t", $three,"\n";
}
}
输出:
app/base/cmd myapp:hello 3guys jack mike tom 1 jack 2 mike 3 tom
更多时候,我们无法判断使用者真实提交了几个参数,所以请给参数制定默认值,或者使用func_get_args()获取各个参数。
<?php
class myapp_command_hello extends base_shell_prototype{
var $command_world = 'Helloworld';
var $command_world_options = array(
'quietly'=>array('title'=>'项目模板','short'=>'q'),
'from'=>array('title'=>'项目模板','need_value'=>1),
);
function command_world(){
$options = $this->get_options();
if($options['quietly']){
echo "hello, xxx\n";
}else{
echo "hello, world\n\t\t --from {$options['from']}\n";
}
}
}
app/base/cmd myapp:hello world --from tom hello, world --from tom
这里使用-q或者--quietly是等价的。
<?php
class myapp_command_hello extends base_shell_prototype{
var $command_cart = 'Hello guys';
function command_cart(){
$this->output_line("Cart");
$rows = array();
$rows[] = array('Type','Price',"Number");
$rows[] = array('apple','1.3',20);
$rows[] = array('orange','3',20);
$rows[] = array('banana','4.5',10);
$rows[] = array('something very long, very long,long','4.5',10);
$this->output_table($rows);
}
}
效果:
app/base/cmd dev:hello cart Cart -------------------------------------------------------- Type Price Number apple 1.3 20 orange 3 20 banana 4.5 10 something very long, very long,long 4.5 10