PHP カーネルの探索: Zend 仮想マシン
前回の検討で、サーバー側での PHP ファイルの実行処理には、大きく次の 2 つの処理があることが分かりました。
- に実行が必要なファイルを渡すphp プログラムと php プログラム 基本的な準備が完了したら、PHP と Zend エンジンを起動し、登録した拡張モジュールを読み込みます。
- 初期化が完了すると、スクリプト ファイルが読み取られ、Zend エンジンはスクリプト ファイルに対して字句解析と構文解析を実行します。次に、それをオペコードにコンパイルして実行します。 apc などのオペコード キャッシュがインストールされている場合、コンパイル プロセスがスキップされ、オペコードがキャッシュから直接読み取られて実行されることがあります。
2 番目のステップでは、字句解析、構文解析、中間コードのコンパイル、中間コードの実行などを総称して Zend 仮想マシンと呼びます。 Java や C# などのコンパイル済み言語と比較して、PHP は手動のコンパイル プロセスを必要とせず、コンパイルなしで実行できます。 Java には、複数のプラットフォームで統一された言語を実装する独自の Java 仮想マシンがあり、C# には、単一のプラットフォームで複数の言語を実装する独自の .NET 仮想マシンがあります。PHP も同様に、独自の Zend 仮想マシンを持っています。これらは本質的に同じであり、両方とも抽象コンピュータです。 これらの仮想マシンは、低レベル言語から別の言語を抽象化し、独自の命令セットと独自のメモリ管理システムを備えています。 最終的には、より高い抽象レベルの言語実装をより低い抽象レベルの言語実装に変換し、メモリ管理、ガベージ コレクション、その他のメカニズムなどの他の補助機能を実装して、特定の実装に対するプログラマの作業を軽減し、より多くの時間を費やすことができます。ビジネス ロジックに投資された労力。 抽象的なレベルで見ると、Zend 仮想マシンは Java や他の言語よりも高度です。ここでいう高度とは、簡単に言うと、Zend 仮想マシンが実際のマシンの実装から遠く離れていることを意味します。 。 近年、言語の発展は抽象的なものばかりが続き、根本的な変化はなく、常に機械から遠ざかっています。
ここでは、仮想マシンの過去と現在から始めて、構文の実装例とソース コード暗号化のプロセスの説明を交えながら、Zend 仮想マシンの実装原理と主要なデータ構造について説明します。そして復号化。
Wiki における仮想マシンの定義は次のとおりです: 仮想マシン (Virtual Machine) は、コンピュータ サイエンスのアーキテクチャにおいて、コンピュータ プラットフォームとエンド ユーザー環境の間で作成できる特別なソフトウェアを指します。エンドユーザーは、ソフトウェアによって作成された環境に基づいてソフトウェアを操作します。 コンピューター サイエンスでは、仮想マシンとは、実際のマシンのようにプログラムを実行できるコンピューターのソフトウェア実装を指します。
仮想マシンは、独自の命令セットと独自のメモリ管理システムを備えた抽象的なコンピューターです。 このような仮想マシンに実装された言語は、より低い抽象レベルの言語よりも明確で、学習が容易です。
PHP ファイルはどのように解析されますか? 生成された中間コードは実際の PHP コードとどのように対応していますか? 実行中にどのような中間データが保存されますか?仮想マシン全体を最適化できますか?最適化するにはどうすればよいですか?
Zend 仮想マシンのアーキテクチャ
Zend 仮想マシンの実装を概念層から抽象化すると、Zend 仮想マシンのアーキテクチャを解釈層、実行エンジン、中間データ層に分割できます。
Zend 仮想マシンのアーキテクチャ図
PHP コードの一部が Zend 仮想マシンに入ると、コンパイルと実行という 2 つのステップが実行されます。 これはインタープリター言語にとって創造的な動きですが、現在の実装は不完全です。 PHP コードが Zend 仮想マシンに入ると、これら 2 つのステップで実行されますが、これらの 2 つのステップは通常の実行プロセスでは連続しています。つまり、Java のようなものに変換されていないのと同じです。言語: コンパイルされた結果を保存するために中間ファイルが生成されます。 このような操作を毎回実行すると、PHP スクリプトのパフォーマンスに大きな損失が生じます。 APC、eAccelerator などに似たキャッシュ ソリューションもありますが、しかし、その本質は変わっておらず、2 つのステップを分離して別々に開発することはできません。
解釈層
解釈層は、Zend 仮想マシンがコンパイル プロセスを実行する場所です。これには、字句解析、構文解析、中間コードを生成するコンパイルの 3 つの部分が含まれます。 字句解析とは、実行したいPHPソースファイルからスペースやコメントを取り除き、トークンに分割し、プログラムの階層構造を処理することです。
文法分析は、定義された文法規則に従って、受け入れられたトークン シーケンスに基づいていくつかのアクションを実行することです。Zend 仮想マシンで現在使用されている Bison は、Backus Normal Form (BNF) を使用して文法を記述します。 中間コードのコンパイルと生成は、構文解析の結果に基づいて行われ、PHP5.3.1 では、Zend 仮想マシンは 135 の命令をサポートします (Zend/zend_vm_opcodes.h ファイルを参照)。これは単純な出力ステートメントです。プログラム内の複雑な再帰呼び出しであるかどうかに関係なく、Zend 仮想マシンは最終的に、作成したすべての PHP コードをこれらの 135 命令のシーケンスに変換し、実行エンジンで順番に実行します。
中間データ層
Zend 仮想マシンが PHP コードを実行する場合、中間コード、PHP 独自の関数リスト、ユーザー定義関数リスト、PHP 独自のクラス、ユーザー定義のクラス、定数、プログラムによって作成されたオブジェクト、関数またはメソッドに渡されるパラメーター、戻り値、ローカル変数、および一部の操作の中間結果など。 データが保存されるこれらすべての場所を中間データ層と呼びます。
PHP が MOD 拡張機能として Apache2 サーバーにアタッチされている場合、PHP に付属する関数リストなど、中間データ層の一部のデータが複数のスレッドで共有される可能性があります。 単一のプロセスのみを考慮すると、プロセスが作成されると、PHP に付属するさまざまな関数リスト、クラス リスト、定数リストなどがロードされます。 解釈層が PHP コードをコンパイルすると、さまざまなユーザー定義関数、クラス、または定数が前のリストに追加されますが、これらの関数の構造における特定のフィールドの割り当ては異なります。
実行エンジンが生成された中間コードを実行すると、新しい実行中間データ構造 (zend_execute_data) が Zend 仮想マシンのスタックに追加されます。これには、現在の実行のアクティブなシンボル リストのスナップショットが含まれますプロセス、いくつかのローカル変数など。
実行エンジン
Zend 仮想マシンの実行エンジンは、中間コード シーケンス (EX(opline)) に基づいて、対応するメソッドを段階的に呼び出すだけの非常に単純な実装です。 実行エンジンには、次の命令を格納するための PC レジスタのような変数はありません。Zend 仮想マシンが特定の命令を実行するとき、そのすべてのタスクが実行されると、この命令は単独で次の命令を呼び出します。シーケンス ポインタは 1 つ前に移動して次の命令を実行し、最後に return ステートメントを実行します。 これは本質的にはネストされた関数呼び出しです。
元の質問に戻りますが、PHP が字句解析、構文解析、中間コード生成の 3 つのステップを通過した後、PHP ファイルは PHP の中間コード オペコードに解析されます。 生成された中間コードと実際の PHP コードの間には、完全な 1 対 1 の対応関係はありません。ユーザーが指定した PHP コード、PHP の構文規則、および一部の内部規則に基づいて中間コードを生成するだけであり、これらの中間コードは、データと関連付けを転送するためにいくつかのグローバル変数にも依存する必要があります。生成された中間コードの実行処理は、中間コードの滑らかさと実行処理におけるグローバル変数に依存し、ステップバイステップで実行されます。もちろん、関数ジャンプに遭遇したときにオフセットも発生しますが、最終的にはオフセット ポイントに戻ります。
さらに読む
この記事のトピックのリストは次のとおりです:
- PHP コアの探索: SAPI インターフェースから開始
- PHP コアの探索: リクエストの開始と終了
- PHP コアの探索: リクエストのライフサイクル
- PHP カーネルの探索: シングルプロセス SAPI ライフサイクル
- PHP カーネルの探索: マルチプロセス/スレッド SAPI ライフサイクル
- PHP カーネルの探索: Zend Engine
- PHP カーネルの探索:再び SAPI について説明します
- PHP カーネルの探索: Apache モジュールの紹介
- PHP カーネルの探索: mod_php5 による PHP サポート
- PHP カーネルの探索: Apache の実行および関数のフック
- PHP カーネルの探索: 組み込み PHP
- PHP カーネルの探索: PHP 用 FastCGI
- PHP カーネルの探索: PHP スクリプトの実行方法
- PHP カーネルの探索: PHP スクリプトの実行の詳細
- PHP カーネルの探索: オペコード OpCode
- PHP カーネルの探索: PHP のオペコード
- PHP カーネルの探索: インタプリタ実行プロセス
- PHP カーネルの探索: 変数の概要
- PHP コアの探索: 変数ストレージと型
- PHP コアの探索: PHP のハッシュ テーブル
- PHP コアの探索: Zend のハッシュ テーブルについて
- PHPカーネルの探索: PHP ハッシュ アルゴリズムの設計
- PHP カーネルの探索: HashTables 記事の翻訳
- PHP カーネルの探索: ハッシュ衝突攻撃とは何ですか?
- PHP カーネルの探索: 定数の実装
- PHP カーネルの探索: 変数の保存
- PHP カーネルの探索: 変数の型
- PHP カーネルの探索: 変数値の操作
- PHP コアの探索: 変数の作成
- PHP コアの探索: 事前定義された変数
- PHP コアの探索: 変数の取得
- PHP コアの探索:変数の型変換
- PHP カーネルの探索: 弱く型指定された変数の実装
- PHP カーネルの探索: 静的変数の実装
- PHP カーネルの探索: 変数の型のヒント
- PHP コアの探索: 変数のライフサイクル
- PHP コアの探索: 変数の代入と破棄
- PHP コアの探索: 変数スコープ
- PHP コアの探索: 奇妙な変数名
- PHP カーネルの探索: 変数の値と型の保存
- PHP カーネルの探索: グローバル変数 Global
- PHP カーネルの探索: 変数の型変換
- PHP カーネルの探索: メモリ管理の開始
- PHP カーネルの探索: Zend Memory Manager
- PHP カーネルの探索: PHP のメモリ管理
- PHP カーネルの探索: メモリの適用と破壊
- PHP カーネルの探索: 参照カウントとコピーオンライト
- PHP カーネルの探索: PHP5.3 ガベージ コレクション メカニズム
- PHP カーネルの探索: メモリ管理内のキャッシュ
- PHP カーネル探索: コピーオンライト COW メカニズム
- PHP カーネルの探索: 配列とリンク リスト
- PHP カーネルの探索: ハッシュ テーブル API の使用
- PHP カーネルの探索: 配列操作
- PHP カーネルの探索: 配列ソース コード分析
- PHP カーネルの探索: 関数の分類
- PHP カーネルの探索: 関数の内部構造
- PHP カーネルの探索: 関数構造変換
- PHP カーネル探索: 関数を定義するプロセス
- PHP カーネル探索: 関数のパラメータ
- PHP カーネル探索: zend_parse_parameters 関数
- PHP コアの探索: 関数の戻り値
- PHP コアの探索: 仮パラメータの戻り値
- PHP コアの探索: 関数呼び出しと実行
- PHP コアの探索: 参照と関数実行
- PHP コアの探索: 匿名関数とクロージャ
- PHP コアの探索: オブジェクト指向の開始
- PHP コアの探索: クラスの構造と実装
- PHP コアの探索: クラスのメンバー変数
- PHP コアの探索: クラスのメンバー メソッド
- PHP コアの探索: クラスのプロトタイプ zend_class_entry
- PHP コアの探索: 定義クラスの
- PHP コアの探索: アクセス制御
- PHP コアの探索: 継承、ポリモーフィズム、抽象クラス
- PHP コアの探索: マジック関数と遅延バインディング
- PHP コアの探索: 予約クラスと特殊クラス
- PHP コアの探索: オブジェクト
- PHP コアの探索: オブジェクト インスタンスの作成
- PHP コアの探索: オブジェクト属性の読み取りと書き込み
- PHP コアの探索: ネームスペース
- PHP コアの探索: インターフェイスの定義
- PHP コアの探索: インターフェイスの継承と実装
- PHP コアの探索: リソース resource type
- PHP カーネルの探索: Zend 仮想マシン
- PHP カーネルの探索: 仮想マシンの字句解析
- PHP カーネルの探索: 仮想マシンの構文解析
- PHP カーネルの探索: 中間コード opcode の実行
- PHP カーネルの探索: コードの暗号化と復号化
- PHP カーネルの探索: zend_execute の具体的な実行プロセス
- PHP カーネルの探索: リファレンス変数とカウント ルールの説明
- PHP カーネルの探索: 新しいガベージ コレクション メカニズムの説明

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。
