ソース解読:php artisan serve
原文:https://www.codecasts.com/blo...
Laravelを学ぶとき、多くの人が接触する最初のartisanの命令は:
コードはどこだ?
以前のソースコード解読記事と同様に、エディタの検索機能を使用することをお勧めします.
最初のステップ
まず、
上の
ステップ2
具体的な効果は次のとおりです.
ステップ3
1.次のコードはphpの実行可能な全パスを返します.
2.次のコードは
このセクションでは、
このように、
3.次のコードは、
コードは
上の2と3は直接このように考証することができます:
4.次のコードは、実行コードのフルパスを返します.
だから、最後の
このように見ると、
その上で、
最後に
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
がプロジェクトのルートディレクトリです!ステップ2
fire()
の2行目のコードによって実現される情報を印刷します.$this->line("Laravel development server started: host()}:{$this->port()}>");
具体的な効果は次のとおりです.
ステップ3
passthru($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を使用している内蔵サーバとは大きな違いはありません.