ソース解読:php artisan serve

3484 ワード

原文:https://www.codecasts.com/blo...

Laravelを学ぶとき、多くの人が接触する最初のartisanの命令は:php artisan serveで、このように私たちは最初のLaravelの応用を走ることができます.このコマンドラインのソースコードを解読してみましょう.
コードはどこだ?
以前のソースコード解読記事と同様に、エディタの検索機能を使用することをお勧めします.ServeCommandを直接検索すると、このコマンドのソースコードファイルを直接開くことができます.Illuminate\Foundation\Console\ServeCommandにあります.他のartisanコマンドのように、fire()の方法に注目します.
 public function fire(){
        chdir($this->laravel->publicPath());

        $this->line("Laravel development server started: host()}:{$this->port()}>");

        passthru($this->serverCommand());
}

最初のステップ
まず、chdir()を使用して、public/コードの$this->laravel->publicPath()に従って、publicPath()ディレクトリにディレクトリを変更します.この方法のソースコードは、Illuminate\Foundation\Applicationにあります.
public function publicPath()
    {
        return $this->basePath.DIRECTORY_SEPARATOR.'public';
    }

上の$this->basePathがプロジェクトのルートディレクトリです!
ステップ2fire()の2行目のコードによって実現される情報を印刷します.
$this->line("Laravel development server started: host()}:{$this->port()}>");

具体的な効果は次のとおりです.
ステップ3passthru($this->serverCommand())のオリジナル関数passthru()から実装された実行コマンド.$this->serverCommand()は、実行可能な コマンドを返します.具体的なコードは、同じファイルのserverCommand()にあります.
 protected function serverCommand()
    {
        return sprintf('%s -S %s:%s %s/server.php',
            ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)),
            $this->host(),
            $this->port(),
            ProcessUtils::escapeArgument($this->laravel->basePath())
        );
    }
sprintf()の4つの文字列プレースホルダは、後で入力される4つのパラメータに置き換えられ、最終的に実行可能なPHPコマンドが印刷されます.この4つは、それぞれ次のように対応します.
1.次のコードはphpの実行可能な全パスを返します.
ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false))

2.次のコードはhostを返し、デフォルトは127.0.0.1です.
$this->host()

このセクションでは、host()メソッドを直接表示できます.
 protected function host()
    {
        return $this->input->getOption('host');
    }

このように、serveコマンドを使用する場合、hostパラメータを入力することができます.
3.次のコードは、portを返します.hostと同じです.
$this->port()

コードはport()メソッド、( serve !)です.
 protected function port()
    {
        return $this->input->getOption('port');
    }

上の2と3は直接このように考証することができます:php artisan help serveを実行します
4.次のコードは、実行コードのフルパスを返します.
ProcessUtils::escapeArgument($this->laravel->basePath())

だから、最後のserverCommand()が戻ってきたのは何ですか?直接印刷してみましょう.
このように見ると、php artisan serveコマンドはphpを直接使用してserver.phpファイルを実行します.このファイルはプロジェクトのルートディレクトリの下にあります.例えば、コマンドラインで次のコマンドを直接実行することに相当します.
php -S 127.0.0.1:8000 server.php

その上で、public/をウェブサイトのルートディレクトリに指定してください.
最後にphp artisan serveコマンドの背後にはphpを使用して直接ファイルを実行することがあります.php -S php -S 127.0.0.1:8000 PHPを使用している内蔵サーバとは大きな違いはありません.