PHP 配列は、当然 Zend HashTable を通じて実装されます。
foreach 操作を実装するにはどうすればよいですか?配列の Foreach は、ハッシュテーブル内の二重リンク リストを走査することによって完了します。インデックス配列の場合、foreach を介した走査は for よりもはるかに効率的であり、キー→値を検索する必要がなくなります。 count オペレーションは、HashTable->NumOfElements, O(1) オペレーションを直接呼び出します。 「123」のような文字列の場合、zend はそれを整数形式に変換します。 $arr[‘123’] と $arr[123] は同等です
リソースタイプ変数は、PHP で最も複雑な変数であり、複合構造でもあります。
PHP の zval は幅広いデータ型を表すことができますが、カスタム データ型を完全に記述することは困難です。これらの複合構造を表現する効率的な方法がないため、それらに対して従来の演算子を使用する方法はありません。この問題を解決するには、リソースと呼ばれる本質的に任意の識別子 (ラベル) を介してポインターを参照するだけで済みます。
zval では、リソースに対して、lval がリソースのアドレスを直接指すポインターとして使用されます。リソースは任意の複合構造にすることができます。よく知られている mysqli、fsock、memcached などはすべてリソースです。
リソースの使用方法:
登録: カスタム データ型の場合、それをリソースとして使用します。まず、これを登録する必要があります。そうすれば、zend はそれにグローバルに一意の識別子を割り当てます。
リソース変数を取得する: リソースに関して、zend は実際のデータの id->hash_tale を維持します。リソースの場合、その ID のみが zval に記録されます。フェッチするときは、id を通じて hash_table 内の特定の値を検索し、それを返します。
リソースの破壊: リソースのデータ型は多様です。 Zend 自体にはそれを破壊する方法はありません。したがって、ユーザーはリソースを登録する際に破棄機能を提供する必要があります。リソースの設定が解除されると、zend は対応する関数を呼び出して破棄を完了します。グローバルリソーステーブルからも削除してください。
リソースは、それを参照しているすべての変数がスコープ外になった後だけでなく、リクエストが終了して新しいリクエストが生成された後でも、長期間存続することができます。これらのリソースは、特に破棄されない限り、SAPI のライフサイクル全体にわたって存続するため、永続リソースと呼ばれます。多くの場合、永続リソースによりパフォーマンスがある程度向上します。たとえば、一般的な mysql_pconnect では、永続リソースは pemalloc を通じてメモリを割り当て、リクエストが終了しても解放されないようにします。 zend の場合、2 つの区別はありません。
PHP ではローカル変数とグローバル変数はどのように実装されますか?リクエストの場合、PHP はいつでも 2 つのシンボル テーブル (symbol_table と active_symbol_table) を参照でき、前者はグローバル変数を維持するために使用されます。後者は、現在アクティブな変数シンボル テーブルを指すポインターです。プログラムが関数に入ると、zend はシンボル テーブル x をそれに割り当て、active_symbol_table を a に指します。このようにして、グローバル変数とローカル変数の区別が行われます。
変数値の取得: PHP のシンボル テーブルは hash_table を通じて実装され、取得時に、対応する zval が識別子に従ってテーブルから検索され、返されます。
関数でグローバル変数を使用する: 関数では、明示的に global を宣言することでグローバル変数を使用できます。 active_symbol_tableのsymbol_tableに同じ名前の変数への参照を作成します。symbol_tableに同じ名前の変数が存在しない場合は、それが最初に作成されます。
PHP 実行メカニズムのこのプロセス:
1. PHP 関連のプロセスを手動で開始したことはありません。Apache の起動時に実行されます。2. PHP は mod_php5.so モジュールを通じて Apache に接続されます (サーバー アプリケーション プログラミング インターフェイス);
3. PHP には、カーネル、Zend エンジン、拡張層の 3 つのモジュールがあります。
4. PHP カーネルは、リクエスト、ファイル ストリーム、その他の関連操作を処理するために使用されます。 5. Zend Engine (ZE) は、ソース ファイルをマシン語に変換し、仮想マシン上で実行するために使用されます。
6. 拡張レイヤーは、PHP が特定の操作を実行するために使用する関数、クラス ライブラリ、およびストリームのセットです。 。たとえば、MySQL データベースに接続するには mysql 拡張機能が必要です。
7. ZE がプログラムを実行するとき、ZE は制御を拡張機能に渡し、その後それを返します。特定のタスクを処理します。
8. 最後に、ZE はプログラムの実行結果を PHP カーネルに返し、PHP カーネルはその結果を SAPI 層に送信し、最終的にブラウザに出力します。
PHP の動作メカニズムについての詳細な説明
PHP の動作メカニズム - PHP 起動の最初のステップ
最初のステップと 2 番目のステップが何かわからないですか?心配しないでください。これについては次に詳しく説明します。
最初の最も重要なステップを見てみましょう。覚えておくべきことは、操作の最初のステップはリクエストが到着する前に行われるということです。 Apache の起動後、PHP インタープリタも起動し、PHP は各拡張機能の MINIT メソッドを呼び出し、これらの拡張機能を使用可能な状態に切り替えます。 php.ini ファイルでどのような拡張子が開かれているかを確認してください。MINIT は「モジュールの初期化」を意味します。各モジュールは、他のリクエストを処理するための関数、クラス ライブラリなどのセットを定義します。
典型的な MINIT メソッドは次のとおりです:
PHP_MINIT_FUNCTION(extension_name){ /* 関数、クラスなどを初期化します */ }
PHP の動作メカニズム: PHP 起動の 2 番目のステップ
ページリクエストが発生すると、SAPI 層は制御を PHP 層に渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。 PHP は各モジュールの RINIT メソッド、つまり「リクエストの初期化」を呼び出します。典型的な例はセッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、$_SESSION 変数は初期化され、モジュールの RINIT メソッドが呼び出されたときに関連するコンテンツが読み込まれます。準備プロセスはプログラムの実行の間に自動的に開始されます。
典型的な RINIT メソッドは次のとおりです:
PHP_RINIT_FUNCTION(extension_name) { /* セッション変数の初期化、変数の事前設定、グローバル変数の再定義など */ }
PHP 操作メカニズムにおける PHP シャットダウンの最初のステップ
はPHP の起動と同様に、PHP は 2 つの手順でシャットダウンします。ページが実行されると (ファイルの最後に到達するか、exit または die 関数で終了するかに関係なく)、PHP はクリーンアップ プログラムを開始します。各モジュールの RSHUTDOWN メソッドを順番に呼び出します。 RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。
典型的な RSHUTDOWN メソッドは次のとおりです:
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* メモリ管理を行い、最後の PHP 呼び出しで使用されたすべての変数の設定を解除します。など */ }
PHP 動作メカニズムの PHP シャットダウンの 2 番目のステップ
最後に、すべてのリクエストが処理され、SAPI を閉じる準備が整い、PHP は 2 番目のステップの実行を開始します。PHP は各拡張機能の MSHUTDOWN メソッドを呼び出します。これは、各モジュールがメモリを解放する最後の機会です。
典型的な RSHUTDOWN メソッドは次のとおりです:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* ハンドラーや永続メモリなどを解放します */ }
このようにして、PHP のライフサイクル全体が終了します。なお、「第1ステップの開始」と「第2ステップの終了」はサーバからのリクエストがない場合のみ実行されます。
関連する推奨事項:
JavaScript クロージャの基礎となる動作メカニズム コードの詳細な説明
JavaScript クロージャの基礎となる動作メカニズム
PHP_PHP チュートリアルの基礎となる動作メカニズムを探索する
|