ホームページ >バックエンド開発 >PHPチュートリアル >require_once のパフォーマンスは実際には非常に低い_PHP チュートリアル
テスト後、require_once はパフォーマンスが低い構文構造です。もちろん、このパフォーマンスの低さは、プロジェクトで現在使用されている require メソッドについて説明し、同時に実験コードを通じてその効率性を証明します。使用中に問題が発生しても、他の人が同じ問題に遭遇することを防ぐことができます。
上記が2つの違いです。 2 つの唯一の違いは、require_once が参照されているかどうかを判断するメカニズムを備えていることであることがわかります。インターネットで検索すると、require_once のパフォーマンスが require よりもはるかに低いというデータが数多く見つかります。この実験はここでは行いません。
私たちのプロジェクトのアプローチは次のとおりです: 必要な場合は、isset($xxxxxx) または require 'xxxxx.php' を使用して、各ファイルの先頭でグローバル変数を定義します。
このアプローチの欠点は何ですか?$xxx にグローバル変数が定義されている場合、そのファイルが関数内で必要な場合、その変数はグローバルではなく関数のローカル変数として解析されます。そのため、関数内で isset($xxx) または require 'xxx を実行します。文法構造 .php' は無効になり、クラスの再定義、メソッドの再定義など、予期せぬ結果が確実に発生します。
過去の教訓から、グローバル変数を定義するには、 $GLOBALS['xxx'] を使用してください。直接定義すると少し遅くなりますが、間違っているよりははるかに優れています。
以前のグローバル変数は直接定義されていたため、今日同僚と議論しているときに、別の書き方を考えました:
定義された場所は引き続き $xxx メソッドを使用して直接定義され、require メソッドで変更されます (ファイル ヘッダーで定義されたグローバル変数はファイル名に関連付けられます)。
リーリー
この方法は動的変数を使用します。直接 GLOBALS 方法と比較すると、次の 2 つの重大な欠点があります。動的変数の導入により、パフォーマンスは GLOBALS メソッドより約 2 倍遅くなります。
require_requirionce.php
リーリーrequire_requirionce_require.php (requireのテストに使用する導入ファイル)
リーリーrequire_requirionce_requirionce.php (require_onceのテストに使用される導入ファイル)
リーリーテスト結果は以下の通りです(単位:秒):
メソッドを使用せずにメソッドを設定または要求する: 0.22953701019287
それでは、パフォーマンスの低下は正確にどこで発生するのでしょうか?
上記の require_requireone.php ファイルの test1 メソッドで、 pathinfo($filename) とコメントしました。これは、私の当初の意図は、マークされたグローバル変数名としてサフィックスのないファイル名を使用することであったためですが、 pathinfo を使用すると、このメソッドのパフォーマンス消費は基本的に require_once と同じです。そこで、pathinfo への別の呼び出しを追加してテストを行いました。確かに、pathinfo が問題を引き起こしていました。そこで、後で現在のバージョンに修正し、ファイル名を直接変数名として使用しました。ファイル名が重複するのが怖い場合は、パス名を追加することもできます...
。推測: pathinfo を追加した後、require と require_once のパフォーマンス消費は基本的に同じなので、PHP の require_once の内部処理はそれに基づいていると推測できますか? PHP5.3 では require_once が大幅に最適化されたと言われていますが、私はテスト中に PHP5.3.5 バージョンを使用しましたが、以前のバージョンよりも大幅に最適化されているだけでしょうか。これはまだテストされていません....
test1 メソッドを次のように変更してみてください: isset($GLOBALS[substr($filename, 0, strlen($filename) - 4)]) または require $filename;
手動の文字列インターセプトを使用します。もちろん、インターセプトには時間がかかりますが、pathinfo バージョンよりも優れています。今回の検証結果は以下の通りです
メソッドを使用せずにメソッドを設定または要求する: 0.21035599708557
各ファイルヘッダーは、$GLOBALS['XXX'] = 1; を使用して定義された一意のマーカー変数を定義し、変数名はファイル名またはパスを含むファイル名にすることをお勧めします (別のファイル名が繰り返される場合) )