前回の検討で、サーバー側での 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 カーネルの探索: 新しいガベージ コレクション メカニズムの説明

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

Dreamweaver Mac版
ビジュアル Web 開発ツール
