この理由は確かに正しいですが、今日話したいのは別の理由です
ファイルがロードされているかどうかを判断するには、PHP がファイルの open_path を取得する必要があることがわかっています。これは、たとえば次のことを意味します。
次のようなコードをコピーします:
& lt ;? php
set_include_path ("/tmp/:/tmp2/"); PHP は include_once "2.php" を認識します。このファイルのパスは であり、ロードされたファイルのリストからはロードされたかどうかを判断できないため、include_once の実装では、まずこのファイルの実際のパスを解析します (通常のファイルの場合、この解析はチェックするのと同じです) getcwd とファイル パスを指定するため、相対パスの場合は通常は成功しません)。解析が成功した場合は、EG (include_files) を検索します。存在する場合は、それが含まれていることを意味します。そうでない場合は、戻ります。ファイルを開いて、このファイルのopened_pathを取得します。たとえば、上記の例では、このファイルは「/tmp2/2.php」に存在します。
次に、opened_pathを取得した後、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
true
http://www.bkjia.com/PHPjc/328035.html
技術記事
確かに、この理由は正しいのですが、今日話したいのは、ファイルがロードされているかどうかを判断するには、PHP がファイルの open_pat を取得する必要があるということです...。