ホームページ バックエンド開発 PHPチュートリアル Baidu エンジニアが語る PHP 機能の実装原理とパフォーマンス分析 (1)

Baidu エンジニアが語る PHP 機能の実装原理とパフォーマンス分析 (1)

Aug 08, 2016 am 09:24 AM
function php struct type zend

Baiduエンジニアが語るPHP機能の実装原理とパフォーマンス分析(1)

はじめに
どの言語においても、関数は最も基本的な構成要素です。 PHPの関数にはどのような特徴があるのでしょうか?関数呼び出しはどのように実装されますか? php 関数のパフォーマンスはどうですか? 使用方法について何か提案はありますか?この記事では、実装を理解しながら PHP プログラムをより適切に作成できるように、原理を分析し、実際のパフォーマンス テストと組み合わせることで、これらの質問に答えていきます。同時に、いくつかの一般的な PHP 関数が紹介されます。
PHPの関数の分類
PHPでは関数を横に分けるとユーザー関数(組み込み関数)と内部関数(組み込み関数)の2つに分類されます。前者はプログラム内でユーザーがカスタマイズした一部の関数やメソッドであり、後者はPHP自体が提供する各種ライブラリ関数(sprintfやarray_pushなど)です。ユーザーは、後で紹介する拡張メソッドを使用してライブラリ関数を作成することもできます。ユーザー関数は、関数 (関数) とメソッド (クラス メソッド) に分類できます。この記事では、これら 3 つの関数をそれぞれ分析してテストします。
php関数の実装
php関数は最終的にどのように実行されるのでしょうか?
この質問に答えるために、まず PHP コードを実行するプロセスを見てみましょう。

図 1 からわかるように、PHP は典型的な動的言語実行プロセスを実装しています。コードの一部を取得した後、字句解析、構文解析、その他の段階を経て、ソース プログラムが命令 (オペコード) に変換されます。 ZEND 仮想マシンはこれらの命令を順番に実行して操作を完了します。 Php 自体は C で実装されているため、最終的に呼び出される関数はすべて C の関数です。実際には、PHP は C で開発されたソフトウェアと考えることができます。上記の説明から、PHP での関数の実行は呼び出し用のオペコードにも変換されることがわかります。各関数呼び出しは実際に 1 つ以上の命令を実行します。
各関数について、zend は次のデータ構造で記述されます
typedef union _zend_function { zend_uchar type; /* MUST be the first element of this struct! */ struct { zend_uchar type; /* never used */ char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; } common; zend_op_array op_array; zend_internal_function internal_function; } zend_function; typedef struct _zend_function_state { HashTable *function_symbol_table; zend_function *function; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; } zend_function_state;
type は関数のタイプを示します: ユーザー関数、組み込み関数、オーバーロード関数。 Commonには、関数名、パラメータ情報、関数フラグ(通常関数、静的メソッド、抽象メソッド)などの関数の基本情報が含まれます。また、ユーザー関数については、内部変数などを記録した関数シンボルテーブルもありますが、詳細は後述します。 Zend は、大規模なハッシュ テーブルであるグローバル function_table を維持します。関数が呼び出されると、まず関数名に基づいてテーブルから対応する zend_function が検索されます。関数呼び出しを行うとき、仮想マシンは関数の種類に基づいて呼び出し方法を決定します。関数の種類が異なれば、実行原理も異なります。
組み込み関数
組み込み関数は基本的に実際の C 関数であり、PHP は最終コンパイル後に zif_xxxx という名前の関数に展開します。たとえば、一般的な sprintf は最下層の zif_sprintf に対応します。 Zend の実行中に組み込み関数が見つかった場合、転送操作が実行されます。
Zend は、パラメーターの取得、配列操作、メモリ割り当てなどを含む、呼び出し用の一連の API を提供します。組み込み関数のパラメータは、zend_parse_parameters メソッドを通じて取得されます。配列や文字列などのパラメータについては、zend は浅いコピーを実装しているため、この効率は非常に高くなります。 PHP 組み込み関数の場合、転送呼び出しが追加されるだけで、その効率は対応する C 関数の効率とほぼ同じであると言えます。
組み込み関数は、so を通じて PHP に動的にロードされます。ユーザーは、ニーズに応じて対応する so を記述することもできます。これは、私たちがよく拡張機能と呼ぶものです。 ZEND は拡張機能で使用するための一連の API を提供しています
ユーザー関数
組み込み関数と比較して、PHP で実装されるユーザー定義関数は、実行プロセスと実装原理がまったく異なります。上で述べたように、PHP コードは実行のためにオペコードに変換されることがわかっており、ユーザー関数も例外ではありません。実際、各関数は一連のオペコードに対応しており、この一連の命令は zend_function に保存されます。したがって、ユーザー関数の呼び出しは、最終的に一連のオペコードの実行に対応します。
》》ローカル変数の保存と再帰の実装
関数の再帰はスタックを通じて完了することが分かりました。 php では、これを実現するために同様の方法が使用されます。 Zend は、アクティブ シンボル テーブル (active_sym_table) を各 PHP 関数に割り当て、現在の関数内のすべてのローカル変数のステータスを記録します。すべてのシンボル テーブルはスタックの形式で維持され、関数が呼び出されるたびに、新しいシンボル テーブルが割り当てられ、スタックにプッシュされます。呼び出しが終了すると、現在のシンボル テーブルがスタックからポップされます。これにより、状態の保存と再帰が可能になります。
スタックのメンテナンスのために、zend はここで最適化を行いました。スタックをシミュレートするために長さ N の静的配列を事前に割り当てます。静的配列を使用して動的データ構造をシミュレートするこの方法は、呼び出しごとに発生するメモリ割り当てを回避します。 ZEND は、関数呼び出しの終了時に現在のスタックの最上位にあるシンボル テーブル データをクリーンアップするだけです。静的配列の長さは N であるため、関数呼び出しレベルが N を超えると、プログラムはスタック オーバーフローを引き起こすことはなく、この場合、zend はシンボル テーブルを割り当てて破棄し、大幅なパフォーマンスの低下を引き起こします。 zend では、N の現在の値は 32 です。したがって、PHP プログラムを作成するときは、関数呼び出しレベルが 32 を超えないようにすることが最善です。もちろんWebアプリケーションであれば関数呼び出しレベル自体は深くても構いません。
》》パラメータの転送は、zend_parse_params を呼び出してパラメータを取得する組み込み関数とは異なります。ユーザー関数でのパラメータの取得は命令によって完了します。関数が持つパラメータの数は命令の数に対応します。実装に特有の、通常の変数の代入です。上記の分析から、組み込み関数と比較して、スタック テーブルが独自に維持され、各命令が C 関数として実行されるため、ユーザー関数のパフォーマンスが相対的に大幅に低下することがわかります。具体的な比較分析は後ほど。したがって、関数に対応する PHP 組み込み関数がある場合は、その関数を自分で書き直して実装しないようにしてください。

参照元:
Baiduエンジニアが語るPHP機能の実装原理と性能分析(1)
http://www.lai18.com/content/410091.html

以上、Baidu エンジニアが解説する PHP 機能の実装原理とパフォーマンス分析 (1) を内容も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

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

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles