* @link http://www.yiiframework.com/ * @copyright 2008-2013 Yii Software LLC * @license http://www.yiiframework.com/license/ */ /** * ShellCommand executes the specified Web application and provides a shell for interaction. * * @property string $help The help information for the shell command. * * @author Qiang Xue * @package system.cli.commands * @since 1.0 */ class ShellCommand extends CConsoleCommand { /** * @return string the help information for the shell command */ public function getHelp() { return <<usageError("{$args[0]} does not exist or is not an entry script file."); // fake the web server setting $cwd=getcwd(); chdir(dirname($entryScript)); $_SERVER['SCRIPT_NAME']='/'.basename($entryScript); $_SERVER['REQUEST_URI']=$_SERVER['SCRIPT_NAME']; $_SERVER['SCRIPT_FILENAME']=$entryScript; $_SERVER['HTTP_HOST']='localhost'; $_SERVER['SERVER_NAME']='localhost'; $_SERVER['SERVER_PORT']=80; // reset context to run the web application restore_error_handler(); restore_exception_handler(); Yii::setApplication(null); Yii::setPathOfAlias('application',null); ob_start(); $config=require($entryScript); ob_end_clean(); // oops, the entry script turns out to be a config file if(is_array($config)) { chdir($cwd); $_SERVER['SCRIPT_NAME']='/index.php'; $_SERVER['REQUEST_URI']=$_SERVER['SCRIPT_NAME']; $_SERVER['SCRIPT_FILENAME']=$cwd.DIRECTORY_SEPARATOR.'index.php'; Yii::createWebApplication($config); } restore_error_handler(); restore_exception_handler(); $yiiVersion=Yii::getVersion(); echo <<runShell(); } protected function runShell() { // disable E_NOTICE so that the shell is more friendly error_reporting(E_ALL ^ E_NOTICE); $_runner_=$this->createCommandRunner(); $this->addCommands($_runner_); $_commands_=$_runner_->commands; $log=Yii::app()->log; while(($_line_=$this->prompt("\n>>"))!==false) { $_line_=trim($_line_); if($_line_==='exit') return; try { $_args_=preg_split('/[\s,]+/',rtrim($_line_,';'),-1,PREG_SPLIT_NO_EMPTY); if(isset($_args_[0]) && isset($_commands_[$_args_[0]])) { $_command_=$_runner_->createCommand($_args_[0]); array_shift($_args_); $_command_->init(); $_command_->run($_args_); } else echo eval($_line_.';'); } catch(Exception $e) { if($e instanceof ShellException) echo $e->getMessage(); else echo $e; } } } /** * Creates a commands runner * @return CConsoleCommandRunner * @since 1.1.16 */ protected function createCommandRunner() { return new CConsoleCommandRunner; } /** * Adds commands to runner * @param CConsoleCommandRunner $runner * @since 1.1.16 */ protected function addCommands(CConsoleCommandRunner $runner) { $runner->addCommands(Yii::getPathOfAlias('system.cli.commands.shell')); $runner->addCommands(Yii::getPathOfAlias('application.commands.shell')); if(($_path_=@getenv('YIIC_SHELL_COMMAND_PATH'))!==false) $runner->addCommands($_path_); } } class ShellException extends CException { }