PHP は、1994 年に個人の Web サイトを管理するために Rasmus Lerdorf によって最初に開発されたサーバーサイド スクリプト言語です。 1995 年に PHP が一般公開され、Web 開発者が動的コンテンツをより簡単に作成できるようになりました。 PHP コードはサーバー側で実行されるため、データベースと対話し、ユーザー入力を処理し、動的な Web ページを配信する Web アプリケーションの作成に最適です。
簡単な例から始めましょう:
echo "Hello world";
コンピュータのターミナルでこのコードを実行すると、ターミナルに「Hello world」という出力が表示されます。私たちのコンピューターは 0 や 1 のようなマシンコードしか理解できないことはわかっています。
これを理解するために、コンピューターがコードをどのように理解するかを見てみましょう。コンピューターは、バイナリ形式 (0 と 1) であるマシンコードのみを理解します。 PHP などの高レベルのコードを実行するには、コードをマシンコードに変換する必要があります。ここでコンパイラとインタプリタが活躍します。
コンパイラとインタープリタはどちらも、プログラミング言語で書かれたソース コードをマシンコードに変換する翻訳ソフトウェアまたはプログラムです。つまり、人間が理解できるコードは、これらのコンパイラまたはインタプリタによって、コンピュータが理解できるマシン コード (0 と 1) に変換され、コンピュータが命令を実行して出力を提供できるようになります。これらの翻訳者をより深く理解するために、これらの翻訳者についての基本的な概要を見てみましょう。
インタプリタは、高級言語で書かれたソース コード全体を 1 行ずつ読み取り、各行を即座にマシンコードに変換する一種のトランスレータです。コード行の読み取り中にエラーが発生した場合、直ちに停止してプログラマにエラーを報告するため、デバッグが容易になります。この行ごとの実行により、コンパイラと比較してプロセスが遅くなります。
コンパイラは、高級言語で書かれたソース コード全体を一度にマシン コードに変換する一種のトランスレータです。コードにエラーがある場合でも、コンパイラはコード全体をコンパイルしますが、エラーは実行時に検出されるため、プログラマがエラーを特定して修正することが難しくなります。ただし、コンパイラはソースコード全体を一度にマシンコードに変換するため、一般に実行時はインタプリタよりも高速に実行されます。
答えは、PHP は主にインタプリタ言語であるということです。 PHP スクリプトが実行されると、C や C などのコンパイル済み言語のように、事前にコードをマシンコードにコンパイルするのではなく、PHP インタープリターはコードを実行時に解析して実行します。ただし、OPcache などのツールを使用したバイトコード キャッシュなどの一部の最適化では、リクエストごとにコードが再解釈されるのを避けるためにコンパイルされたバイトコードを保存することでパフォーマンスを向上させることができます。
Facebook が開発した、Just-In-Time (JIT) コンパイル プロセスを使用して PHP コードを実行する HHVM (HipHop Virtual Machine) のようなプロジェクトもあります。これにより、PHP コードを中間バイトコードにコンパイルし、それをオンザフライでマシンコードにコンパイルできるため、PHP の実行が高速化されます。 PHP 8 では、JIT コンパイルが PHP に直接統合され、コードの一部をコンパイルできるようになり、解釈された動作とコンパイルされた動作の間の境界線がさらに曖昧になりました。
JIT (Just-In-Time コンパイル) は、コードの一部を事前にコンパイルするのではなく、実行に合わせて「ジャスト イン タイム」にコンパイルすることによってコードを実行する方法です。コードを 1 行ずつ読み取って実行する従来のインタープリター実行とは異なり、JIT コンパイルでは、コードの一部が実行時に必要になる直前にマシンコードに変換されます。これにより、マシン コードが CPU 上で直接実行され、解釈を繰り返す必要がなくなるため、実行が高速化されます。
JIT コンパイルは、完全に解釈された実行と完全にコンパイルされた実行の間に位置します。一般的な仕組みは次のとおりです:
初期解釈: コードは最初に軽量な方法で解釈または実行され、どの部分が最も頻繁に使用されているか、または計算集約的であるかを分析します。
オンザフライ コンパイル: JIT コンパイラーは、「ホット スポット」、つまり頻繁に実行されるコード セクション、または最適化が必要なコード セクションを特定します。次に、実行時にこれらのセクションをマシンコードにコンパイルします。
実行: コンパイルされたマシンコードが保存されるため、今後の実行では再コンパイルせずに最適化されたバージョンを使用できるため、パフォーマンスが向上します。
PHP では、PHP 8 で JIT が導入され、頻繁に使用される関数やループを実行時にマシンコードにコンパイルすることで、より高速に実行できるようになりました。 JavaScript (Chrome の V8 エンジンなど) や Java などの他の言語も、同様のパフォーマンス上の利点を得るために JIT コンパイルを使用します。
最初のブロックには、コードを記述します。このコードは、まず JIT (Just-In-Time コンパイラ) に入ります。次に、JIT がコードをコンパイルして実行します。この実行中、JIT はコードを 1 行ずつ読み取り、読み取り後すぐに各行をマシンコードに変換します。読み取りプロセス中にいずれかの行にエラーがある場合、その時点で停止し、そのエラーがスローされます。
これにより、高レベルの PHP コード (私たちが作成するコード) がコンピューターによってどのように理解され、実行されるかについて少し理解できるようになります。
PHP スクリプトは、コマンド ライン インターフェイス (CLI) と Web サーバー環境という 2 つの主な環境で実行できます。
コマンド ライン インターフェイス (CLI): PHP コードは、コンピューター上のコマンド ラインから直接実行できます。これにより、開発者はブラウザを使わずにスクリプトを実行できるようになり、自動化、cron ジョブ、またはスクリプトのテストによく使用されます。
Web サーバー環境: PHP は通常、Web サーバー環境内で実行され、クライアント/ブラウザからのリクエストに応答してコードが実行されます。 PHP スクリプトがリクエストされると、Web サーバーはインターフェイス層 (CGI、FastCGI、または FPM など) を介して PHP エンジンと通信し、スクリプトを処理して出力をクライアントに返します。
各環境は異なるユースケースに対応するため、PHP は Web アプリケーションとコマンドライン アプリケーションの両方で柔軟な言語となります。
私たちのコンピュータには、さまざまな目的で実行されるさまざまなアプリケーションやプログラムが含まれています。ただし、これらのアプリケーションやプログラムを実行する場合、単独では実行できません。代わりに、コンピュータのオペレーティング システムを通じて実行されます。 PHP でコードを記述すると、そのコードはコンピューターの端末で実行できるプログラムにもなります。したがって、ターミナル経由でコードを実行すると、オペレーティング システム経由でも実行されます。
そこで問題は、このアプリケーションやプログラム、あるいは私たちが作成したコードはどのようにしてコンピューターのオペレーティング システムと通信するのかということです。
ここでは、オペレーティングシステムと通信するための手段をOS API(Operating System's API)と呼びます。上の図に示すように、この OS API を通じて、アプリケーションまたはプログラムはコンピューターのオペレーティング システムと通信できます。これにより、コンピューター上のターミナルで PHP コードがどのように実行されるかについてある程度理解できるようになります。
まず、クライアント/ブラウザから Web サーバーにリクエストを送信します。ただし、Web サーバーは PHP エンジンと直接通信できません。 Web サーバーと PHP エンジン間の通信では、SAPI またはサーバー API として知られる中間層がそれらの間で機能します。 SAPI としてさまざまなプロトコルが使用され、Web サーバーが PHP エンジンと通信できるようになります。これらのプロトコルには、CGI、FastCGI、mod_php、FPM などが含まれます。これらのプロトコルのいずれかを Web サーバーと PHP エンジン間の通信に使用できます。
PHP スクリプトを実行するための 2 つの最も一般的な Web サーバーは、Apache と Nginx です。
これにより、PHP コードが Web サーバー上でどのように実行されるのかをより深く理解できるようになります。以上の点を踏まえて
PHP コードが実際にバックグラウンドでどのように動作するかについて、基本的なアイデアを理解できたと思います。役に立った場合は、他の人と共有することを忘れないでください。
以上がPHP の仕組み - 舞台裏の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。