php shell 編程

說明

腳本文件爲:     phpCli
linux文件路徑: /usr/local/bin/phpCli (須要可執行權限 chmod +x phpCli)
linux執行:     phpCli
window執行:    php phpCli

1.hash-bang 聲明

#!/usr/local/bin/php -Cq
  • 針對 linux 使用聲明,將腳本放置 linux 系統 默認shell執行位置 /usr/local/bin
  • 文件名(通常無後綴)就是命令名稱 phpCli 對應執行命令爲 /usr/local/bin/php -Cq /usr/local/bin/phpCli 參數
  • 腳本操做比較大時建議 用後即焚 (關閉文件操做符,清空數組,關閉鏈接等)

2.基本參數

var_dump($argv);
/*array(2) {
    [0]=>
    string(6) "phpCli"
    [1]=>
    string(4) "test"
}*/

運行:phpCli test ;
cli 模式下,參數會保存在$argv中.php

3.用戶輸入

print 'please input something !'."\n";
$message = trim(fgets(STDIN));
var_dump($message);
//test

標準輸入在 PHP流的 STDIN 中,或者 unix風格的 '終端輸入' 設備 /dev/tty 中得到.
運行:phpCli 會獲得提示語 please input something ! .
輸入信息 test ,var_dump($message)會輸出 test .linux

4.解析命令行選項

//這裏使用了自定義
switch ('test')
{
    case '-m':
        $this->shell = 'php -m';
        break;
    case '-v':
        echo $this->command.' 1.0.1-dev (cli)';
        $this->putFormat(true);
        break;
    case '-h':
    case '-help':
        $this->help();
        break;
    default:
        $this->help();
        break;
}

PEAR 提供了 Console_Getopt包能夠同時支付簡短和長格式(GNU風格)的選項.
默認是與PHP綁定安裝的,除非你關閉了PEAR .
也能夠自行定義 .docker

5.良好的習慣(建議)

  • 使用信息
  • 退出代碼
  • 錯誤信息
  • 大多數都是用 一個簡短信息來響應 -h | -help

6.進程控制

/*pcntl_fork — 在當前進程當前位置產生分支(子進程)。
譯註:fork是建立了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,
不一樣的是父進程執行過程當中,獲得的fork返回值爲子進程 號,而子進程獲得的是0。 */

$pid = pcntl_fork();
//父進程和子進程都會執行下面代碼
if ($pid == -1) {
    //錯誤處理:建立子進程失敗時返回-1.
    die('could not fork');
} else if ($pid) {
    //父進程會獲得子進程號,因此這裏是父進程執行的邏輯
    echo 'this is parent test' ;
    pcntl_wait($status); //等待子進程中斷,防止子進程成爲殭屍進程。
} else {
    //子進程獲得的$pid爲0, 因此這裏是子進程執行的邏輯。
    echo 'this is son test';
}
  • 進程概念(自行了解)
  • Forking概念(自行了解)

7.簡單例子

#!/usr/local/bin/php -Cq
<?php
class PHPCli
{
/** 命令名稱
 * @var string
 */
private $command = 'phpCli';

/** 輸入數據
 * @var
 */
private $initData ;

/** 首個數據
 * @var
 */
private $initFirst ;

/** 格式化輸出
 * @var bool
 */
private $format = true;

/** @var array 命令支持 */
private $runCommand = ['ds','dsa'] ;

/** @var array  */
private $shellMap = [
        'ds'  => 'docker ps',
        'dsa' => 'docker ps -a'
] ;

/** 執行shell
 * @var
 */
private $shell ;

/**
 * PHPCli constructor.
 * @param $argv
 */
public function __construct($argv)
{
    # 基本參數 入口文件
    $this->initFirst = $argv[0] ;
    array_shift($argv);

    $this->initData = $argv ;
}

/** 格式輸出
 * @param bool $end
 */
private function putFormat($end = false)
{
    print "\n";
    if($end) {
        exit();
    }
}

/*
 * 使用說明
 */
private function help()
{
    $this->putFormat();
    print 'Usage: '.$this->command.' Command'."\n";
    $this->putFormat();

    print 'Options:'."\n";
    print '         -v  Show phpCli version'."\n";
    print '         -m  Show php model'."\n";
    print '         -h  Display this help'."\n";
    $this->putFormat();

    print 'Commands:'."\n";
    print '          ds     Run docker command `docker ps`'."\n";
    print '          dsa    Run docker command `docker ps -a`'."\n";
    $this->putFormat();
    exit();
}

/** shell運行
 * @return mixed
 */
private function shell()
{
    if(!$this->shell) {
        exit();
    }
    if($this->format) {
        //$status 格式輸出
        system($this->shell, $status);
    }else{
        // $status 以數組形式返回
        exec($this->shell, $status);
    }
    //passthru();
    return $status ;
}

/**
 * 功能入口
 */
public function run()
{
    $label = $this->initData[0] ?? '' ;
    if(empty($label)) {
        $this->help();
    }
    if($label[0] == '-') {
        switch ($label)
        {
            //可擴展其它短命令
            case '-m':
                $this->shell = 'php -m';
                break;
            case '-v':
                echo $this->command.' 1.0.1-dev (cli)';
                $this->putFormat(true);
                break;
            case '-h':
            case '-help':
                $this->help();
                break;
            default:
                $this->help();
                break;
        }
    }else{
        if(in_array($label,$this->runCommand)) {
            //可擴展更多shell
            $this->shell = $this->shellMap[$label];
        }else{
            echo "Run '".$this->command." -help' for more information on a command.";
            $this->putFormat(true);
        }
    }
    $this->shell();
}
}
$phpCli = new PHPCli($argv);
$phpCli->run();
exit();

運行: phpCli shell

圖片描述

運行: phpCli -m
圖片描述數組

運行:phpCli dsa
圖片描述this

感謝閱讀!

相關文章
相關標籤/搜索