123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- <?php
- /**
- * @link http://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- namespace yii\console\controllers;
- use Yii;
- use yii\console\Controller;
- use yii\helpers\Console;
- /**
- * Runs PHP built-in web server.
- *
- * In order to access server from remote machines use 0.0.0.0:8000. That is especially useful when running server in
- * a virtual machine.
- *
- * @author Alexander Makarov <sam@rmcreative.ru>
- * @since 2.0.7
- */
- class ServeController extends Controller
- {
- const EXIT_CODE_NO_DOCUMENT_ROOT = 2;
- const EXIT_CODE_NO_ROUTING_FILE = 3;
- const EXIT_CODE_ADDRESS_TAKEN_BY_ANOTHER_SERVER = 4;
- const EXIT_CODE_ADDRESS_TAKEN_BY_ANOTHER_PROCESS = 5;
- /**
- * @var int port to serve on.
- */
- public $port = 8080;
- /**
- * @var string path or [path alias](guide:concept-aliases) to directory to serve
- */
- public $docroot = '@app/web';
- /**
- * @var string path to router script.
- * See https://secure.php.net/manual/en/features.commandline.webserver.php
- */
- public $router;
- /**
- * Runs PHP built-in web server.
- *
- * @param string $address address to serve on. Either "host" or "host:port".
- *
- * @return int
- */
- public function actionIndex($address = 'localhost')
- {
- $documentRoot = Yii::getAlias($this->docroot);
- if (strpos($address, ':') === false) {
- $address = $address . ':' . $this->port;
- }
- if (!is_dir($documentRoot)) {
- $this->stdout("Document root \"$documentRoot\" does not exist.\n", Console::FG_RED);
- return self::EXIT_CODE_NO_DOCUMENT_ROOT;
- }
- if ($this->isAddressTaken($address)) {
- $this->stdout("http://$address is taken by another process.\n", Console::FG_RED);
- return self::EXIT_CODE_ADDRESS_TAKEN_BY_ANOTHER_PROCESS;
- }
- if ($this->router !== null && !file_exists($this->router)) {
- $this->stdout("Routing file \"$this->router\" does not exist.\n", Console::FG_RED);
- return self::EXIT_CODE_NO_ROUTING_FILE;
- }
- $this->stdout("Server started on http://{$address}/\n");
- $this->stdout("Document root is \"{$documentRoot}\"\n");
- if ($this->router) {
- $this->stdout("Routing file is \"$this->router\"\n");
- }
- $this->stdout("Quit the server with CTRL-C or COMMAND-C.\n");
- passthru('"' . PHP_BINARY . '"' . " -S {$address} -t \"{$documentRoot}\" $this->router");
- }
- /**
- * {@inheritdoc}
- */
- public function options($actionID)
- {
- return array_merge(parent::options($actionID), [
- 'docroot',
- 'router',
- 'port',
- ]);
- }
- /**
- * {@inheritdoc}
- * @since 2.0.8
- */
- public function optionAliases()
- {
- return array_merge(parent::optionAliases(), [
- 't' => 'docroot',
- 'p' => 'port',
- 'r' => 'router',
- ]);
- }
- /**
- * @param string $address server address
- * @return bool if address is already in use
- */
- protected function isAddressTaken($address)
- {
- list($hostname, $port) = explode(':', $address);
- $fp = @fsockopen($hostname, $port, $errno, $errstr, 3);
- if ($fp === false) {
- return false;
- }
- fclose($fp);
- return true;
- }
- }
|