1. 程式人生 > >Ecstore的cmd模式(shell)流程

Ecstore的cmd模式(shell)流程

Shell維護已經是一種預設的推薦方式,有點返璞歸真的味道,即從DOS->GUI,再從GUI->DOS,類似以前路由器的概念,只有Cisco這種通過命令列配置的才算高大上, 任何從頁面進行配置的路由器都不算是路由器一樣。Ecstore的框架就有帶shell,大多數人都知道用cmd update,但是很少人知道cmd update之後,它具體幹了什麼事,於是有了本文。

我們先來看一下,執行cmd後,系統呼叫了哪些檔案。拿windows系統為例,cmd.bat在/base下面,在不設定path的情況下,使用者需要到app/base目錄下執行cmd命令,這時系統是執行了cmd.bat。開啟該檔案看到以下幾行,很短。

@echo off
if "%OS%"=="Windows_NT" @setlocal
set SCRIPT_DIR=%~dp0
set PHP_COMMAND=php.exe
if "%SCRIPT_DIR%" == "" (
  %PHP_COMMAND% "cmd" %*
) else (
  %PHP_COMMAND% "%SCRIPT_DIR%\cmd" %*
)
if "%OS%"=="Windows_NT" @endlocal

很簡單,批處理的程式碼,看不懂也沒關係,tiandi告訴你,這段程式碼在正常情況下,它是執行了php.exe /base/app/cmd這道命令,同目錄下有個cmd檔案,看清楚,沒有後綴的,用文字編輯器開啟,內容其實就是php而已,首行標識了指令碼需要用php解析,接近底部的地方,有下面程式碼,new了一個base_shell_loader。

$shell = new base_shell_loader;
$shell->run();

好了,到這裡神祕面紗揭開了,後面也沒什麼東西了,無非是載入了base_shell_buildin這個類,而一些基礎的命令都寫在了這個類檔案的方法裡。比如cmd kvrecovery做了點什麼呢?在此檔案裡有以下程式碼:

function command_kvrecovery($instance=null) 
    {
        if(!is_null($instance) && !defined('FORCE_KVSTORE_STORAGE')){
            $instance = trim($instance);
            if(!(strpos($instance, '_') === 0)){
                $instance = 'base_kvstore_' . $instance;
            }
            define('FORCE_KVSTORE_STORAGE', $instance);
        }
        base_kvstore::config_persistent(false);
        $testObj = base_kvstore::instance('test');
        if(get_class($testObj->get_controller()) === 'base_kvstore_mysql'){
            logger::info('The \'base_kvstore_mysql\' is default persistent, Not necessary recovery');
            exit;
        }
        logger::info('KVstore Recovery...');
        $db = kernel::database();
        $count = $db->count('SELECT count(*) AS count FROM sdb_base_kvstore', true);
        if(empty($count)){
            logger::info('No data recovery');
            exit;
        }
        $pagesize = 100;
        $page = ceil($count / 100);
        for($i=0; $i<$page; $i++){
            $rows = $db->selectlimit('SELECT * FROM sdb_base_kvstore', $pagesize, $i*$pagesize);
            foreach($rows AS $row){
                //logger::info($row['key']);continue;
                $row['value'] = unserialize($row['value']); //todo:合法資料
                if(base_kvstore::instance($row['prefix'])->recovery($row)){
                    logger::info($row['prefix'] .'=>' . $row['key'] . ' ... Recovery Success');
                }else{
                    logger::info($row['prefix'] .'=>' . $row['key'] . ' ... Recovery Failure');
                }
            }
        }
    }//End Function

到這裡,文章也就結束了,shell流程僅此而已,其餘的請自行研究吧。

文章評分5次,平均分5.0