includeとinclude_onceの違いを知って以来、繰り返しロードを避けるために一度だけロードするものだと思ってinclude_onceを使用していますが、繰り返しロードされているかどうかを判断できないようです. それはいつも間違っていることがわかりました。
実際、プロジェクトが複数人で開発されている場合は、include_once の方が優れています
解析が成功した場合は、ファイルの絶対パスを解析してみてください。 EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します。ファイルを開き、ファイルのオープン パス (開いたパス) を取得し、EG (include_files) への開いたパスを取得して、存在するかどうかを確認します。存在する場合は戻り、存在しない場合は続行します。 ファイルをコンパイルします (compile_file
最近、apc.include_once_override について何度か議論しましたが、この APC 設定項目はまだ十分に実装されていません。
require_once
) のどちらを使用するかについて、この議論は非常に長く、結論は常に次のとおりです。つまり、include_once の代わりに include を使用しようとするのです。これまで最も一般的な理由は、include_once はロードされたファイルのリストをクエリし、存在するかどうかを確認してから、再度ロードする必要があるというものでした。確かに、この理由は正しいです。しかし、今日話したいのは別の理由ですPHP がファイルがロードされているかどうかを判断するには、ファイルの open_path を取得する必要があることはわかっています。これは、たとえば次のことを意味します。
<?php set_include_path("/tmp/:/tmp2/"); include_once("2.php"); ?>
ほとんどの場合は問題ありませんが、APC を使用する場合に問題が発生します...
APC 使用中、APC は、compile_file のポインターをハイジャックして、コンパイル結果を直接取得しますキャッシュからキャッシュから削除することで、実際のファイルを開いたり、オープンするためのシステムコールを回避したりできます。
ただし、コード内で include_once を使用すると、compile_file の前に、PHP はすでにファイルを開こうとしており、その後、APC によってハイジャックされたコンパイル ファイルを入力します。このようにして、追加のオープン操作が発生します。この問題を解決するために、APC は include_once_override を導入しました。include_once_override がオンになっている場合、APC は PHP の ZEND_INCLUDE_OR_EVAL オペコード ハンドラーをハイジャックし、ファイルの絶対パスが stat によって決定されます。ロードされていないことがわかり、
include するようにオペコードを書き換えて、難しい解決策を作成するだけです
<?php set_include_path("/tmp"); function a($arg = array()) {include_once("b.php");}a();a();?>
<?phpclass B {}?>
Fatal error - include() : Cannot redeclare class
自動ロード
を使用することもできます。この時点では。 include_once を使用する場合、それはコードに自信がないことを証明するだけです。 したがって、皆さんには include_once を使用しないことをお勧めします以上がinclude の代わりに include_once を使用してしまう私がいつも犯す間違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。