動的言語としての PHP はどのように実装され、その基礎となるメカニズムは何であり、どのような特徴があるのでしょうか? この記事では、PHP の設計概念、全体的な構造、コア データ構造、変数など、関連する基礎知識を簡単な言葉で紹介します。これは、PHP プログラムをより適切に開発し、パフォーマンスを最適化する上で、一定の指針となる重要性を持っています。 TAGPhp の基礎となるメカニズムのパフォーマンス最適化カタログ 1. 概要... 1php とは何ですか?. 1基礎となる実装の目的を理解します... 12. PHP の設計概念と特徴... 13. PHP の 4 層システム... 24. Sapi 35 . Phpの実行プロセス&opcode. 56. HashTable - コアデータ構造... 67. Php変数... 8 概要... 8Zval 9 整数、浮動小数点型変数... 10 配列変数... 10 . 11 リソースタイプ変数... 11 Php変数の範囲... 121. 概要 phpとはWeb開発に適した動的言語です。より具体的に言うと、C 言語を使用して多数のコンポーネントを実装するソフトウェア フレームワークです。より狭義には、強力な UI フレームワークと考えることができます。動的言語を適切に使用するには、まずそれを理解する必要があります。
メモリ管理とフレームワーク モデルは学ぶ価値があります
拡張開発を通じてより強力な機能を実現し、プログラムのパフォーマンスを最適化します
2. PHP の設計コンセプトとマルチプロセスモデルの特徴
PHP はマルチプロセス モデルであるため、異なるリクエストが互いに干渉することはなく、1 つのリクエストの失敗がサービス全体に影響を与えることはありません。もちろん、時代の発展により、PHP はすでにサポートしています。マルチスレッドモデル。弱い型付け言語
c/c++、java、c#、その他の言語とは異なり、Php は型指定が弱い言語です。変数の型は最初には決定されず、操作中に決定され、暗黙的または明示的な変更が発生する可能性があります。型変換、このメカニズムの柔軟性は、Web 開発において非常に便利で効率的です。これについては、後で PHP 変数で詳しく説明します。エンジン(Zend)+コンポーネント(ext)モデルにより内部結合を軽減
中間層 (sapi) は Web サーバーと PHP を分離します
構文はシンプルかつ柔軟で、あまり多くの仕様はありません。 (結果としてスタイルが混在します)
どんなに下手なプログラマであっても、全体の状況を危険にさらすようなとんでもないプログラムは書きません。
3. Php の 4 層システム Php のコアアーキテクチャは以下のとおりです
図 1 PHP の構造 図からわかるように、PHP は下から上まで 4 層システムの Zend エンジンです
Zend は完全に純粋な C で実装されており、PHP コード (字句解析、構文解析、その他のコンパイル プロセス) を実行可能なオペコード処理に変換し、対応する処理メソッドと基本データ (ハッシュテーブルなど) を実装します。 、oo)、メモリの割り当てと管理、および外部呼び出しに対応する API メソッドの提供がすべての中核であり、すべての周辺機能が zend を中心に実装されています。拡張機能
zend エンジンを中心に、拡張機能はコンポーネントベースの方法でさまざまな基本サービスを提供します。一般的な組み込み関数 (配列シリーズなど)、標準ライブラリなどはすべて拡張機能を通じて実装されます。必要に応じて、機能拡張、パフォーマンスの最適化、その他の目的を達成するための拡張機能 (たとえば、Tieba で使用される PHP 中間層やリッチ テキスト解析が拡張機能の代表的なアプリケーションです)。サピ
Sapi の正式名は、サーバー アプリケーション プログラミング インターフェイスであり、PHP が周辺データと対話できるようにするための一連のフック関数を使用します。これは、PHP の非常にエレガントで成功した設計です。 sapi を使用すると、PHP 自体が上位層のアプリケーションから切り離され、分離されます。PHP は、異なるアプリケーションとの互換性を考慮する必要がなくなり、アプリケーション自体も独自の特性に応じて異なる処理方法を実装できます。上位層のアプリケーションについては後ほどsapiの章で紹介します
これは、私たちが通常作成する PHP プログラムです。Web サーバーを介して Web アプリケーションを実装したり、コマンド ラインでスクリプト モードで実行したりするなど、さまざまな Sapi メソッドを通じてさまざまなアプリケーション モードを取得できます。 php が車なら、車のフレームワークは php そのものです
Zend は車のエンジンです
Ext の下にあるさまざまなコンポーネントは車の車輪です
サピは道路とみなすことができ、車はさまざまな種類の道路を走行できます
php プログラムの実行は、道路を走る車のようなものです。したがって、必要なものは次のとおりです。 優れたパフォーマンスのエンジン + 適切な車輪 + 正しい滑走路 4. Sapi 上で述べたように、sapi を使用すると、外部アプリケーションが一連のインターフェイスを通じて PHP とデータを交換でき、さまざまなアプリケーションの特性に応じて特定の機能を実装できます。私たちの一般的なサピスは次のとおりです: apache2handler
これはWebサーバーとしてApacheを使用し、mod_phpモードで実行する場合の処理方法であり、現在最も広く使用されています。 cgi
これは、Web サーバーと php の間のもう 1 つの直接対話方法であり、有名な fastcgi プロトコルであり、近年、fastcgi+php が使用されることが多くなり、非同期 Web サーバーでサポートされる唯一の方法でもあります。 fastcgi と mod_php については、別の記事「php パフォーマンス調査 - mod_php vs fastcgi」cli
を参照してください。コマンドラインから呼び出されるアプリケーションモード Sapi の定義と主なインターフェース機能は次のとおりです
図 2 Sapi プロトコル ここでは、php が呼び出されたときの主要な関数の起動、初期化操作の一部を紹介します
たとえば、CGI モードでは、すべての拡張機能がロードされ、起動時にモジュールの初期化が実行されます。 shutdown: PHP がシャットダウンされたら作業を終了します
アクティブ化: 初期化を要求
dectivate: リクエストの最後に作業を終了します
ub_write: データの出力方法を指定します
たとえば、apache2handler メソッドでは、php が Apache の so として存在するため、その出力は Apache の ap_write 関数を呼び出し、CGI モードではシステムが write を呼び出します。 sapi_error: エラー処理関数
read_post: 投稿データの読み取り
Register_server_variables: $_SERVER に環境変数を登録します
この変数は通常、さまざまなプロトコル標準に従って登録されます。 5. PHP の実行プロセスとオペコード まず、PHP コードの実行プロセスを見てみましょう。
図 3 PHP コードの実行プロセス 図からわかるように、PHP は典型的な動的言語の実行プロセスを実装しています。コードの一部を取得した後、字句解析、構文解析、その他の段階を経て、ソース プログラムは次のように変換されます。命令 (オペコード) は 1 つずつ実行され、ZEND 仮想マシンはこれらの命令を順番に実行して操作を完了します。 Php 自体は C で実装されているため、最終的に呼び出される関数はすべて C の関数です。実際には、PHP は C で開発されたソフトウェアと考えることができます。 上記の説明から、PHP 実行の核は 1 つずつ翻訳された命令であること、つまり、opcode、opcodeOpcode が PHP プログラム実行の最も基本的な単位であることがわかります。オペコードは 2 つのパラメータ (op1、op2)、戻り値、および処理関数で構成されます。 Php プログラムは最終的に、いくつかの一般的な処理関数を順番に実行するオペコード処理関数のセットに変換されます。 ZEND_ASSIGN_SPEC_CV_CV_HANDLER: 変数割り当て ($a=$b) ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER: 関数呼び出し ZEND_CONCAT_SPEC_CV_CV_HANDLER: 文字列のスプライス $a.$b ZEND_ADD_SPEC_CV_CONST_HANDLER: 加算操作$ a+2 ZEND_IS_EQUAL_SPEC_CV_CONST: $a==1 と等しいと判定します。 ZEND_IS_IDENTICAL_SPEC_CV_CONST: $a===16 と等しいと判定します。 HashTable - コア データ構造 HashTable は、PHP のほぼすべての一般的な関数を実装するために使用されます。さらに、zend 内では、関数シンボル テーブルやグローバル変数などの関数もハッシュ テーブルに基づいて実装されています。 PHP のハッシュ テーブルには次の特徴があります: 典型的なキー->値クエリをサポート