ホームページ > バックエンド開発 > PHPチュートリアル > include_once および require_once_PHP チュートリアルは終了してください。

include_once および require_once_PHP チュートリアルは終了してください。

WBOY
リリース: 2016-07-21 15:00:53
オリジナル
709 人が閲覧しました

この理由は確かに正しいですが、今日話したいのは別の理由です
ファイルがロードされているかどうかを判断するには、PHP がファイルの open_path を取得する必要があることがわかっています。これは、たとえば次のことを意味します。

次のようなコードをコピーします:
& lt ;? php
set_include_path ("/tmp/:/tmp2/"); PHP は include_once "2.php" を認識します。このファイルのパスは であり、ロードされたファイルのリストからはロードされたかどうかを判断できないため、include_once の実装では、まずこのファイルの実際のパスを解析します (通常のファイルの場合、この解析はチェックするのと同じです) getcwd とファイル パスを指定するため、相対パスの場合は通常は成功しません)。解析が成功した場合は、EG (include_files) を検索します。存在する場合は、それが含まれていることを意味します。そうでない場合は、戻ります。ファイルを開いて、このファイルのopened_pa​​thを取得します。たとえば、上記の例では、このファイルは「/tmp2/2.php」に存在します。

次に、opened_pa​​thを取得した後、PHPはロードされたファイルのリストを確認します。含まれているかどうかを確認します。含まれていない場合は、直接コンパイルしてファイルを開く必要はありません。

1. ファイルの絶対パスを解析してみます。解析が成功した場合は、EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します。
2. 3. 開いているパスを取得し、存在するかどうかを確認します。存在しない場合は、ファイルをコンパイルします (compile_file)。
ほとんどの場合、これは問題ではありませんが、問題は APC を使用する場合にあります...

APC を使用する場合、APC はコンパイル済みファイルのcompile_file ポインターをハイジャックし、それによってコンパイル結果をキャッシュから直接取得し、代わりにコンパイル結果を回避します。実際のファイルを開く際に、open へのシステムコールが回避されます。
ただし、コード内で include_once を使用すると、compile_file の前に、PHP は既にファイルを開こうとしており、この中に APC によってハイジャックされたコンパイル ファイルが入力されます。この問題を解決するために、APC は include_once_override を導入します。 include_once_override がオンになっている場合、APC は PHP の ZEND_INCLUDE_OR_EVAL オペコード ハンドラーをハイジャックし、ファイル サイズが見つかった場合には stat を使用します。ロードされていない場合は、オペコードを書き換えてインクルードし、トリッキーな解決策を講じます


しかし、残念ながら、前述したように、APC の include_once_override は適切に実装されておらず、いくつかの未定義の問題が発生します。 例:

コードをコピーします

コードは次のとおりです:


set_include_path("/tmp");
function a($arg = array()) {

include_once("b.php" ); } a(); a();
?>



次に、b.php は「/tmp/b.php」に配置され、内容は次のとおりです:



コードをコピーします

コードは次のとおりです:

class B {}
?>
次に、apc.include_once_override がオンになっている場合、継続的にアクセスすると次のエラーが発生します: 致命的なエラー - include (): クラスを再宣言できません

これらの技術的要因を除けば、私は include_once の代わりに include を使用すべきだと常に信じてきました。なぜなら、完全に自分自身で計画でき、ファイルは 1 回だけロードされるからです。これを行うために自動ロードを使用することもできます。

include_once を使用する場合、それは自分のコードに自信がないことを証明するだけです
したがって、皆さんにはもう include_once を使用しないことをお勧めします


http://www.bkjia.com/PHPjc/328035.html

www.bkjia.com


tru​​e

http://www.bkjia.com/PHPjc/328035.html

技術記事

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート