ホームページ >バックエンド開発 >PHPチュートリアル >include の代わりに include_once を使用してしまう私がいつも犯す間違い

include の代わりに include_once を使用してしまう私がいつも犯す間違い

黄舟
黄舟オリジナル
2017-06-25 11:47:322285ブラウズ

includeinclude_onceの違いを知って以来、繰り返しロードを避けるために一度だけロードするものだと思ってinclude_onceを使用していますが、繰り返しロードされているかどうかを判断できないようです. それはいつも間違っていることがわかりました。

実際、プロジェクトが複数人で開発されている場合は、include_once の方が優れています

解析が成功した場合は、ファイルの絶対パスを解析してみてください。 EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します。ファイルを開き、ファイルのオープン パス (開いたパス) を取得し、EG (include_files) への開いたパスを取得して、存在するかどうかを確認します。存在する場合は戻り、存在しない場合は続行します。 ファイルをコンパイルします (compile_file

最近、apc.include_once_override について何度か議論しましたが、この APC 設定項目はまだ十分に実装されていません。

ここでは、この問題の理由と私たちへのヒントを共有したいと思います

include と include_once (以下、すべて

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_pa​​thを取得します。 たとえば、上記の例では、このファイルは次の場所に存在します。 "/tmp2/2.php"。

次に、opened_pa​​th を取得した後、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 するようにオペコードを書き換えて、難しい解決策を作成するだけです

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

<?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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。