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流程仅此而已,其余的请自行研究吧。
想问下博主是否将ecstore迁移到过php7环境
并没有,应该会有一大堆warning。
不止是warning,还有很多fatal error,页面空白等等
所以也是我们懒得动的原因,虽然PHP性能提高很多,但是改动的话,倒是自己给我自己填麻烦。
评论模块为啥要用英文呢??
估计看着高端大气上档次吧。