1. 程式人生 > 程式設計 >PHP 命令列指令碼框架庫

PHP 命令列指令碼框架庫

專案地址: github.com/lvyahui8/rc…

背景

部分業務使用PHP編寫運維指令碼,但PHP缺乏一個易用的命令列程式開發庫. 此框架的基於註解的方式支援填空式的快速開發命令列指令碼. 並提供統一的日誌|引數解析|控制檯格式輸出|幫助檔案能力.

使用方法

引入依賴

在運維指令碼專案中引入依賴.

composer require hongye/rc-cmd
複製程式碼

編寫運維工具類

建立一個工具類比如SampleTool,並繼承\Ruochen\Tools\CommandTool,分別在類和方法上加上如下註解. 最終通過呼叫 SampleTool::getInstance()->process();

使類檔案變為指令碼,併為類檔案加上可執行許可權.

框架實現了一些易用的註解,基於註解快速定義命令、命令選項、命令引數. 由於PHP本身並不支援註解,故註解需要新增在檔案註釋中.

可以為IDE新增註解支援

@\Ruochen\Annotations\Command

此註解為工具定義一個命令,屬性如下

  • name 可選值,如不設值,則命令名稱為方法名
  • desc 可選值,命令的說明

@\Ruochen\Annotations\Operand

此註解為命令定義一個運算元,屬性如下

  • name 必須,運算元名稱
  • mode 模式,列舉值{"required","multiple","optional"}
    • required 表示此命令必須有此運算元
    • multiple 表示此運算元是多個值
    • optional 表示此運算元可選

@\Ruochen\Annotations\Option

此註解為命令定義一個選項。此註解可以註解在class或者command method上,如果註解在class上,則在所有command method上都可以訪問到

  • short 必須,選項縮寫
  • long 長選項
  • mode 模式,列舉值
    • noArg 表示無引數,常用語開關選項
    • requiredArg 選項必須有引數 如:-f /var/mysqld.sock || --file=/var/mysqld.sock
    • optionalArg 選項可選引數
    • multipleArg 選項有多個引數

示例

命令工具檔案 sample

#!/usr/bin/env php
<?php

namespace Ruochen\Tools;

use League\CLImate\CLImate;
use Ruochen\Annotations\Command;
use Ruochen\Annotations\Desc;
use Ruochen\Annotations\Operand;
use Ruochen\Annotations\Option;
use Ruochen\Foundation\CommandTool;
use Ruochen\Helpers\ANSIHelper;
/**
 * Class SampleTool
 * @package Examples
 * @Option(short="d",long="database",desc="select one database",mode="requiredArg")
 */
class SampleTool extends CommandTool {

    /**
     * @Command(desc="query_xxx")
     * @Operand(name="key",mode="required")
     * @Desc("query some data")
     */
    public function query(){
        $database = $this->getOption('d');
        $this->logger->info("query.....$database");
    }

    /**
     * @Command(name="ll")
     * @Desc(value="list all data")
     * @Option(short="f",long="filter",mode="requiredArg",desc="xxxxx")
     */
    public function list(){
        $cli = new CLImate();
        $outTables [] = [
            'Pid','Name','Stat',];
        $outTables [] = [
            1996,'crond',ANSIHelper::colorWrap('OK',ANSIHelper::FG_BLUE),];
        $outTables [] = [
            1107,'sshd',ANSIHelper::colorWrap('ERR',ANSIHelper::FG_READ),];
        $outTables [] = [
            1993,'rsyslogd',ANSIHelper::colorWrap('UNKOWN',ANSIHelper::FG_YELLOW),];
        $cli->columns($outTables);
    }


    /**
     * @Command("dp")
     * @Desc("dump all data")
     */
    public function dump(){
        $this->logger->info("dump.....");
    }
}

$sampleTool = SampleTool::getInstance();

$sampleTool->process();
複製程式碼

命令列提示

$ ./sample
Usage: ./sample <command> [options] [operands]

Options:
  -v,--version   Show version information and quit
  -h,--help      Show this help and quit
  -d,--database  select one database

Commands:
  query  query_xxx
  ll     list all data
  dp     dump all data
複製程式碼
$ ./sample ll
Pid      Name         Stat
1996     crond        OK
1107     sshd         ERR
1993     rsyslogd     UNKOWN
複製程式碼
$ ./sample query xxxx -d lvyahui
[2017-12-26 11:51:45] SampleTool.INFO: query.....lvyahui [] []
複製程式碼

執行依賴

  • php >= 7.0
  • mbstring
  • mcrypt
  • hash
  • composer

專案地址: github.com/lvyahui8/rc…