ホームページ >バックエンド開発 >PHPチュートリアル >include の代わりに include_once を使用してしまう私がいつも犯す間違い
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"); ?>PHP が include_once を認識したとき。 2.php" では、ファイルの実際のパスがわかりません。また、ロードされたファイルのリストからロードされたかどうかを判断することもできないため、include_once の実装では、最初に実際のファイルを解析しようとします。ファイルのパス (通常のファイルの場合、この解析は getcwd とファイル パスのチェックに似ているため、相対パスの場合、通常は成功しません)、解析が成功した場合は、EG (include_files) を検索します。存在する場合は、それが含まれていることを意味し、そうでない場合は、ファイルを開いてファイルのopened_pathを取得します。 たとえば、上記の例では、このファイルは次の場所に存在します。 "/tmp2/2.php"。次に、opened_path を取得した後、PHP はロードされたファイルのリストに移動して、それが含まれているかどうかを確認します。含まれていない場合は、直接コンパイルします。ファイルを開く必要はなくなります。 1. ファイルの絶対パスを解析してみます。解析が成功した場合は、EG (include_files) を確認し、存在するかどうかを確認し、存在する場合は return し、存在しない場合は返します。 4. ファイルのコンパイル (compile_file
ほとんどの場合は問題ありませんが、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();?>次に、b.php
<?phpclass B {}?>という内容で「/tmp/b.php」に配置されます。 そして、apc.include_once_override をオンにすると、連続アクセスすると次のエラーが発生します:
Fatal error - include() : Cannot redeclare class(追記 2012-09-15 02:07: 20: この APC バグを修正しました。 #63070)これらの技術的要因を除けば、私は include_once の代わりに include を使用すべきだと常に信じてきました。なぜなら、完全に自分で計画でき、ファイルは 1 回だけロードされるからです。また、
自動ロード
を使用することもできます。この時点では。 include_once を使用する場合、それはコードに自信がないことを証明するだけです。 したがって、皆さんには include_once を使用しないことをお勧めします以上がinclude の代わりに include_once を使用してしまう私がいつも犯す間違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。