ホームページ >バックエンド開発 >PHP7 >PHP7のソースコード全体の枠組みを詳しく解説

PHP7のソースコード全体の枠組みを詳しく解説

coldplay.xixi
coldplay.xixiオリジナル
2021-02-03 10:18:472483ブラウズ

PHP7のソースコード全体の枠組みを詳しく解説

推奨 (無料): PHP7

1. PHP7 言語の実行原則

一般的に使用される高級言語は多数あり、その実行方法に応じて コンパイル言語と インタープリタ言語の 2 つのタイプに大別できます。

コンパイルとは、アプリケーションのソース プログラムを実行する前に、プログラムのソース コードをアセンブリ言語に「変換」し、さらに次の手順に従ってターゲット ファイルにコンパイルすることを指します。ソフトウェアおよびハードウェア環境。コンパイル作業を完了するツールは、一般に compiler と呼ばれます。

# インタープリタ言語は、プログラムの実行中に機械語に「翻訳」されます。ただし、「翻訳」は1回なので実行効率は低いです。 インタプリタの仕事は、ソースコードをインタプリタ言語で「翻訳」するプログラムです。

C 言語コードの場合、実行可能なバイナリ ファイルになる前に、プリコンパイル、コンパイル、アセンブル、およびリンクを行う必要があります。

C言語に代表されるコンパイル言語では、上記の手順を経てコードを更新する必要があります。

コンパイル言語の実行命令:

コンパイル言語とインタプリタ言語の違いの理解は、ソース上 コードがターゲット プラットフォームの CPU 用の命令にコンパイルされるタイミング。コンパイル言語の場合、コンパイル結果はすでに現在の CPU システム用の命令になっていますが、インタープリタ言語の場合は、最初に中間コードにコンパイルしてから、インタープリタ言語の特定の仮想マシンを介して特定の CPU システムの命令に変換する必要があります。実行。解釈された言語は、実行時にターゲット プラットフォームの命令に翻訳されます。通訳言語は「遅い」とよく言われますが、遅いのは主にそれが原因です。

PHP 7 では、ソースコードを字句解析して複数の文字列単位に分割し、分割された文字列をトークンと呼びます。それぞれの独立したトークンは完全なセマンティクスを表現できないため、構文解析段階を経てトークンを抽象構文ツリー (AST) に変換する必要があります。その後、抽象構文ツリーは実行用のマシン命令に変換されます。 PHP では、これらの命令はオペコードと呼ばれます。

ステップ 1: ソース コードの字句解析を通じてトークンを取得します。

ステップ 2: 構文アナライザーに基づいて抽象構文ツリー (AST) を生成します。

ステップ 3: 抽象構文ツリーはオペコード (オペコード命令セット) に変換され、PHP がオペコードを解釈して実行します。

#1.Token

Token は切り取られる PHP コードです意味のあるロゴに。 PHP には、PHP コードが切り取られた後にトークンを取得するための token_get_all() 関数が用意されています。

2 次元配列の各メンバー配列の最初の値は、Token に対応する列挙値です。 2 番目の値は、トークンに対応する元の文字列の内容です。 3 番目の値は、コードに対応する行番号です。

Token は 1 つずつ「チャンク」であることがわかりますが、存在するチャンクだけでは完全なセマンティクスを表現できず、ルールの助けを借りて整理して接続する必要があります。パーサーはこのオーガナイザーです。構文がチェックされ、トークンが照合され、トークンが関連付けられます。

2.AST

AST は、PHP 7 バージョンの新機能です。以前のバージョンでは、PHP コードの実行中に AST を生成するステップはありませんでした。

AST ノードは、PHP 構文に対応して複数のタイプに分類されます。

PHP-Parser ツール。PHP コードによって生成された AST を表示するために使用できます。

注: PHP-Parser は、PHP 7 カーネルの作成者の 1 人である Nikic によって作成された、PHP ソース コードから AST を生成するツールです。ソース コードは https://github.com/nikic/PHP-Parser で入手できます。

3.opcodes

opcode は単なる 1 つの命令であり、opcodes はオペコードのコレクションであり、PHP 実行時の中間コードです。オペコードが生成されると、仮想マシンによって実行されます。

PHP プロジェクトのより一般的な最適化対策の 1 つは、「opcache を有効にする」です。これは、ここでは opcode キャッシュを指します。ソース コードからオペコードまでの段階を排除することで、エンジンはキャッシュされたオペコードを直接実行できるため、

パフォーマンスが向上します。

vld プラグインを使用すると、PHP コードの一部によって生成されたオペコードを視覚的に確認できます。

opcode は PHP 7 で定義された命令識別子の集合であり、命令は対応するハンドラー (処理関数) に対応します。仮想マシンがオペコードを呼び出すと、オペコードの背後にある処理関数が見つかり、実際の処理が実行されます。

2. カーネル アーキテクチャ

Zend エンジンにはコンパイラとインタプリタが含まれており、PHP コードからオペコードまでの実行はすべて Zend エンジンによって完了します。

PHP のコア機能の実装に加えて、Zend エンジンは、コマンド ライン環境や Web 環境など、より多くのシナリオで PHP を使用できるようにする一連のインターフェイスも提供します。

#アーキテクチャ図は大きく 4 つの部分に分かれています。

1) Zend エンジン: 上記で紹介した字句/文法分析、AST コンパイル、およびオペコードの実行はすべて Zend エンジンに実装されています。また、PHPの変数設計、メモリ管理、プロセス管理などもエンジン層で実装されます。エンジンは PHP の基本サービスを提供します。PHP の信頼性と高いパフォーマンスは、エンジンの基本サポートに依存しています。同時に、Zend エンジンのスケーラビリティは、PHP の大規模アプリケーションの重要な理由の 1 つです。

2) PHP レイヤー: Zend エンジンは PHP の基本機能 (メモリ割り当てやリサイクルなど) を提供しますが、外部からの対話は PHP レイヤーを通じて処理する必要があります。

3) SAPI: SAPI は Server API の略称で、共通の cli SAPI と fpm SAPI が含まれます。 PHP では入出力の仕様が定義されており、この仕様に従って PHP と対話する側をサーバーと呼ぶことができます。

#4) 拡張部分: Zend エンジンは、コア機能とインターフェイス仕様を提供します。これに基づいて開発された拡張機能は、PHP コードのパフォーマンスと機能の多様性のためのより豊富なオプションを提供します。

3. PHP ソース コード ディレクトリ

sapi ディレクトリ ソース コード

sapi directory は、入力層と出力層の抽象化であり、PHP が外部サービスを提供するための仕様です。

PHP プログラムへの入力には、コマンド ラインからの標準入力、または cgi/fastcgi プロトコルに基づくネットワーク リクエストを使用できます。同様に、出力はコマンド ラインの標準出力に書き込むことも、cgi/fastcgi プロトコルに基づいたネットワーク応答としてクライアントに返すこともできます。

コマンド ライン モードはバイナリ プログラム bin/php に対応します。組み込みモジュール モードはバイナリ プログラムを提供する必要がなく、Apache または任意の C/C プログラムから通常の関数として呼び出すことができます。 ; CGI モードはバイナリ プログラム Program bin/cgi に対応し、FastCGI モードはバイナリ プログラム sbin/php-fpm に対応します。

一般的に使用されるいくつかの SAPI。

1) apache2handler: Apache 拡張機能。ダイナミック リンク ライブラリをコンパイルして生成し、Apache で設定します。Apache への http リクエストがあると、このダイナミック リンク ライブラリが設定に従って呼び出され、PHP を実行します。コードを入力し、PHP Interaction との対話を完了します。

2) cgi-fcgi: コンパイル後、CGI プロトコルをサポートする実行可能プログラムが生成され、Web サーバー (通常は Apache または Nginx) が CGI プロトコルを通じてリクエストを CGI プロセスに渡し、実行コードを渡します。結果を Web サーバーに返してプロセスを終了します。

3) fpm-fcgi: fpm の正式名は FastCGI Process Manager で、PHP が正式に提供する FastCGI プロセス マネージャーです。 Nginx サーバーを例に挙げると、http プロトコル リクエストが Nginx サーバーに送信されると、Nginx はそのリクエストを php-fpm プロセスに渡し、FastCGI プロトコルに従って処理します。

4) cli: コマンド ライン インターフェイスの略で、PHP のコマンド ライン インタラクティブ インターフェイスです。

Zend ディレクトリのソース コード

Zend ディレクトリは PHP のコア コードです。

1. メモリ管理モジュール

2. ガベージ コレクション

3. 配列の実装

メイン ディレクトリのソース コード

メイン ディレクトリは、SAPI 層と Zend 層の間の接着剤です。

Zend 層は PHP スクリプトのコンパイルと実行を実装し、sapi 層は入力と出力の抽象化を実装し、メイン ディレクトリは前と次の間のリンクとして機能します: SAPI リクエストの解析と分析実行するスクリプト ファイルとパラメータ。有効にすると、Zend エンジンを呼び出す前に必要な初期化やその他の作業を完了します。

ext ディレクトリのソースコード

ext は PHP 拡張機能に関連するディレクトリで、よく使われる配列、str、pdo などの一連の関数がここに定義されています。

TSRM ディレクトリ ソース コード

初期の頃、PHP は主に単一プロセスおよび単一スレッド モデルで実行されていました。スレッド セーフティ メカニズム ZTS ( Zend Thread Safety) が導入されます。)

TSRM は、Thread Safe Resource Manager - スレッド セーフ リソース マネージャーの略称です。

スレッド セーフティ メカニズムは主に、共有リソースのセキュリティを確保することを目的としています。 PHP のスレッド セーフティ メカニズムはシンプルかつ直観的です。マルチスレッド環境では、各スレッドにグローバル変数の独立したコピーが提供されます。具体的な実装は、カレントスレッドのグローバル変数メモリ領域インデックスとしてTSRMを介して各スレッドに独立したID(オートインクリメント)を割り当てる(割り当て前にロックする)ことで、将来のグローバル変数アクセスにおいてはスレッド間の完全な独立が実現されます。

以上がPHP7のソースコード全体の枠組みを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。