首页 » 非技术 » Ecstore的cmd模式(shell)流程

Ecstore的cmd模式(shell)流程

10570 6

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

本文原始地址:https://www.tiandiyoyo.com/2016/03/what_does_cmd_shell_do_in_ecstore/
本站所有文章,除了特别注明外,均为本站原创,转载请注明出处来自www.tiandiyoyo.com

您可能还会对以下文章感兴趣:

评论前先开启评论开关:


6 Comments

  1. hainuo :

    想问下博主是否将ecstore迁移到过php7环境

  2. 评论模块为啥要用英文呢??

载入分页评论...