You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							181 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
	
	
							181 lines
						
					
					
						
							5.4 KiB
						
					
					
				| <?php | |
| /** | |
|  * Console Application class file. | |
|  * | |
|  * @author Qiang Xue <qiang.xue@gmail.com> | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright © 2008-2012 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\console; | |
|  | |
| /** | |
|  * \yii\console\Application represents a console application. | |
|  * | |
|  * \yii\console\Application extends {@link \yii\base\Application} by providing functionalities | |
|  * specific to console requests. In particular, it deals with console requests | |
|  * through a command-based approach: | |
|  * <ul> | |
|  * <li>A console application consists of one or several possible user commands;</li> | |
|  * <li>Each user command is implemented as a class extending {@link \yii\console\Command};</li> | |
|  * <li>User specifies which command to run on the command line;</li> | |
|  * <li>The command processes the user request with the specified parameters.</li> | |
|  * </ul> | |
|  * | |
|  * The command classes reside in the directory {@link getCommandPath commandPath}. | |
|  * The name of the class follows the pattern: <command-name>Command, and its | |
|  * file name is the same the class name. For example, the 'ShellCommand' class defines | |
|  * a 'shell' command and the class file name is 'ShellCommand.php'. | |
|  * | |
|  * To run the console application, enter the following on the command line: | |
|  * <pre> | |
|  * php path/to/entry_script.php <command name> [param 1] [param 2] ... | |
|  * </pre> | |
|  * | |
|  * You may use the following to see help instructions about a command: | |
|  * <pre> | |
|  * php path/to/entry_script.php help <command name> | |
|  * </pre> | |
|  * | |
|  * @property string $commandPath The directory that contains the command classes. Defaults to 'protected/commands'. | |
|  * @property CommandRunner $commandRunner The command runner. | |
|  * | |
|  * @author Qiang Xue <qiang.xue@gmail.com> | |
|  * @since 2.0 | |
|  */ | |
| class Application extends \yii\base\Application | |
| { | |
| 	/** | |
| 	 * @var array mapping from command name to command configurations. | |
| 	 * Each command configuration can be either a string or an array. | |
| 	 * If the former, the string should be the file path of the command class. | |
| 	 * If the latter, the array must contain a 'class' element which specifies | |
| 	 * the command's class name or {@link \YiiBase::getPathOfAlias class path alias}. | |
| 	 * The rest name-value pairs in the array are used to initialize | |
| 	 * the corresponding command properties. For example, | |
| 	 * <pre> | |
| 	 * array( | |
| 	 *   'email'=>array( | |
| 	 *      'class'=>'path.to.Mailer', | |
| 	 *      'interval'=>3600, | |
| 	 *   ), | |
| 	 *   'log'=>'path/to/LoggerCommand.php', | |
| 	 * ) | |
| 	 * </pre> | |
| 	 */ | |
| 	public $commandMap=array(); | |
|  | |
| 	private $_commandPath; | |
|  | |
| 	/** | |
| 	 * @var \yii\console\CommandRunner | |
| 	 */ | |
| 	private $_runner; | |
|  | |
| 	/** | |
| 	 * Initializes the application by creating the command runner. | |
| 	 */ | |
| 	public function init() | |
| 	{ | |
| 		if(!isset($_SERVER['argv'])) | |
| 		{ | |
| 			die('This script must be run from the command line.'); | |
| 		} | |
| 		$this->_runner=$this->createCommandRunner(); | |
| 		$this->_runner->commands=$this->commandMap; | |
| 		$this->_runner->addCommands($this->getCommandPath()); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Processes the user request. | |
| 	 * This method creates a console command runner to handle the particular user command. | |
| 	 */ | |
| 	public function processRequest() | |
| 	{ | |
| 		$this->_runner->run($_SERVER['argv']); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Creates the command runner instance. | |
| 	 * @return CommandRunner the command runner | |
| 	 */ | |
| 	protected function createCommandRunner() | |
| 	{ | |
| 		return new CommandRunner(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Displays the captured PHP error. | |
| 	 * This method displays the error in console mode when there is | |
| 	 * no active error handler. | |
| 	 * @param integer $code error code | |
| 	 * @param string $message error message | |
| 	 * @param string $file error file | |
| 	 * @param string $line error line | |
| 	 */ | |
| 	public function displayError($code,$message,$file,$line) | |
| 	{ | |
| 		echo "PHP Error[$code]: $message\n"; | |
| 		echo "    in file $file at line $line\n"; | |
| 		$trace=debug_backtrace(); | |
| 		// skip the first 4 stacks as they do not tell the error position | |
| 		if(count($trace)>4) | |
| 			$trace=array_slice($trace,4); | |
| 		foreach($trace as $i=>$t) | |
| 		{ | |
| 			if(!isset($t['file'])) | |
| 				$t['file']='unknown'; | |
| 			if(!isset($t['line'])) | |
| 				$t['line']=0; | |
| 			if(!isset($t['function'])) | |
| 				$t['function']='unknown'; | |
| 			echo "#$i {$t['file']}({$t['line']}): "; | |
| 			if(isset($t['object']) && is_object($t['object'])) | |
| 				echo get_class($t['object']).'->'; | |
| 			echo "{$t['function']}()\n"; | |
| 		} | |
| 	} | |
|  | |
| 	/** | |
| 	 * Displays the uncaught PHP exception. | |
| 	 * This method displays the exception in console mode when there is | |
| 	 * no active error handler. | |
| 	 * @param Exception $exception the uncaught exception | |
| 	 */ | |
| 	public function displayException($exception) | |
| 	{ | |
| 		echo $exception; | |
| 	} | |
|  | |
| 	/** | |
| 	 * @return string the directory that contains the command classes. Defaults to 'protected/commands'. | |
| 	 */ | |
| 	public function getCommandPath() | |
| 	{ | |
| 		$applicationCommandPath = $this->getBasePath().DIRECTORY_SEPARATOR.'commands'; | |
| 		if($this->_commandPath===null && file_exists($applicationCommandPath)) | |
| 			$this->setCommandPath($applicationCommandPath); | |
| 		return $this->_commandPath; | |
| 	} | |
|  | |
| 	/** | |
| 	 * @param string $value the directory that contains the command classes. | |
| 	 * @throws CException if the directory is invalid | |
| 	 */ | |
| 	public function setCommandPath($value) | |
| 	{ | |
| 		if(($this->_commandPath=realpath($value))===false || !is_dir($this->_commandPath)) | |
| 			throw new \yii\base\Exception(Yii::t('yii','The command path "{path}" is not a valid directory.', | |
| 				array('{path}'=>$value))); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Returns the command runner. | |
| 	 * @return CConsoleCommandRunner the command runner. | |
| 	 */ | |
| 	public function getCommandRunner() | |
| 	{ | |
| 		return $this->_runner; | |
| 	} | |
| }
 | |
| 
 |