おまじない php artisan serve からphpをちょっと理解した話
ローカルで作業をしているときに毎回なんとなくターミナルにたたいていたphp artisan serveコマンド。
私の中での位置づけとしては
なんかこのコマンドたたけばブラウザから開発中のWebアプリが見れるな
ぐらいのものでした。
しかしふと
本番環境にはnginxというWebサーバーをいれてそいつがやり取りしてくれているのに、どうして開発しているローカルにはWebサーバーを入れなくても私は画面が見れているんだ?
という問いを持ち、今回の記事を記載しました。
📖 目次
開発環境のWebサーバー
結論から先にいうとphp artisan serveを実行することでPHPビルドインWebサーバーというWebサーバーが起動します。
なのでphp artisan serveを実行した場合の開発環境ではWebサーバがなくてもWebアプリケーションを実行できたのです。
PHPの正体
PHPビルドインWebサーバーとわかった私にはこんな疑問がありました。
PHPビルドインWebサーバーって何?
phpって言語じゃないの?
私の最初のイメージだどphpは言語でありプログラムの書き方以下でも以上でもないという認識でした。
なのでphpの開発サーバーといわれましてもよくわかりませんし、そもそもphp artisan serve のphpって何??(phpは書き方じゃないの?)という状態でした。
PHPの正体(結論)
PHPは大きく分けて2つの意味があります。
- 言語仕様
- 実行エンジン
私がイメージしたPHPとは1つ目の言語仕様の方です。
<?php echo "hello"; ?>
のような書き方のルールをしめします。
このPHPで書かれたコードはphpという実行ファイルが読み取って動かしています。
実行エンジン
今回のphpは2つ目の実行エンジン(PHPコードを読んで動かす機械)に当たります。
php と打つと、C言語から作られた実行ファイルがOSによって起動され、それがPHPコードを解釈・実行します。
php artisan serveはphp という実行エンジンでartisanファイルを実行しているだけです。
このartisanファイルにはphpの言語仕様でサーバーを起動するコードが書かれ、それをphpの実行エンジンが実行して簡易的なWebサーバーを立てています。
ちなみにこれはartisanファイルを実行しているためサーバーが立ち上がるのであって、実際のWebアプリのリクエスト処理でindex.phpを実行するのと仕組みは同じです。
phpの実行エンジンに「どのファイルを渡すか」が違うだけです。
php artisan migtateではmigrateコマンドをもとに実行内容を決定しDBにテーブル等を作成します。
index.phpを実行する
phpがindex.phpを実行すると何が起きるのでしょう。
またどのような過程でindex.phpまでたどり着くのでしょうか。
- ブラウザがリクエストを送る (例: /about にアクセス)
- Nginxがリクエストを受け取る
- 「これはPHPファイルだ」と判断
- PHP-FPMに「index.phpを実行してくれ」と依頼
- PHP-FPM(実行エンジン)がindex.phpを実行
- Laravelのルーター が /about に対応する コントローラーを探す
- コントローラーが処理を実行する (DBからデータ取得など)
- Bladeテンプレート(.blade.php)にデータを渡す
- BladeがPHPコードに変換される (キャッシュとして保存 storage/framework/views/以下)
- PHPの実行エンジンがそれを実行してHTMLを生成
- ブラウザにHTMLを返す
- 画面が表示される
//この状態で保存されている。
<h1><?php echo e($name); ?></h1>
//index.phpで実行される処理。
$app = require __DIR__.'/../bootstrap/app.php';
$app = new Application(...)//Laravel本体のインスタンスを作成
「これはPHPファイルだ」の判断はnginxの設定ファイルに書かれたファイルによって判断されます。
もしここに静的HTMLのファイルが書いてあった場合nginxが自分でindex.htmlを取りに行きます。
Laravelの正体
上の順序をみてこんな疑問が出てきました。
phpで書かれたコードをphp実行エンジンが実行することでHTMLが画面に表示されているはずなのにどうしてこのLaravelというものが実行されているのだろうか。
phpで書かれたものしか実行できないんじゃないの?
Laravelの正体(結論)
LaravelはPHPで書かれたコードの集まりでしかないので、PHPの実行エンジンがそのまま実行できるが答えになります。
Laravelは手順書でしかなく、コードを書く上で書きやすいように私たちがLaravelのルーターやコントローラーを使って書いているだけであって、
最終的にはPHPの実行エンジンがそのPHPファイルを実行しているに過ぎません。
LaravelはPHPの面倒くさい処理を内部に隠蔽してくれているのです。
Laravelは言語でも何でもないのです。