Ecstore的cmd模式(shell)流程
阿新 • • 發佈:2018-12-23
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:★★★★★