Baidu エンジニアが語る PHP 関数の実装原理とパフォーマンス分析 (1)
この記事では主に 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; /* この構造体の最初の要素でなければなりません */
構造体{
zend_uchar 型; /* 使用されません */
char *関数名;
zend_class_entry *scope;
zend_uint fn_flags;
union _zend_function *プロトタイプ;
zend_uint num_args;
zend_uint required_num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
unsigned char return_reference;
} 共通;
zend_op_array op_array;
zend_internal_function external_function;
} zend_function;
typedef struct _zend_function_state {
HashTable *function_symbol_table;
zend_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 組み込み関数がある場合は、その関数を自分で書き直して実装しないようにしてください。
。
PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

HTTPキャッシュヘッダーの主要なプレーヤーには、キャッシュコントロール、ETAG、およびラスト修飾が含まれます。 1.Cache-Controlは、キャッシュポリシーを制御するために使用されます。例:キャッシュコントロール:Max-Age = 3600、public。 2。ETAGは、一意の識別子を介してリソースの変更を検証します。例:ETAG: "686897696A7C876B7E"。 3. Last-Modifiedは、リソースの最後の変更時間を示しています。

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPは、動的なWeb開発およびサーバー側のアプリケーションに使用されるサーバー側のスクリプト言語です。 1.PHPは、編集を必要とせず、迅速な発展に適した解釈言語です。 2。PHPコードはHTMLに組み込まれているため、Webページの開発が簡単になりました。 3。PHPプロセスサーバー側のロジック、HTML出力を生成し、ユーザーの相互作用とデータ処理をサポートします。 4。PHPは、データベースと対話し、プロセスフォームの送信、サーバー側のタスクを実行できます。

PHPは過去数十年にわたってネットワークを形成しており、Web開発において重要な役割を果たし続けます。 1)PHPは1994年に発信され、MySQLとのシームレスな統合により、開発者にとって最初の選択肢となっています。 2)コア関数には、動的なコンテンツの生成とデータベースとの統合が含まれ、ウェブサイトをリアルタイムで更新し、パーソナライズされた方法で表示できるようにします。 3)PHPの幅広いアプリケーションとエコシステムは、長期的な影響を促進していますが、バージョンの更新とセキュリティの課題にも直面しています。 4)PHP7のリリースなど、近年のパフォーマンスの改善により、現代の言語と競合できるようになりました。 5)将来的には、PHPはコンテナ化やマイクロサービスなどの新しい課題に対処する必要がありますが、その柔軟性とアクティブなコミュニティにより適応性があります。

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版
便利なJavaScript開発ツール

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