include と include_once (以下、すべて include require_once) のどちらを使用するかについては長い議論があり、その結論は常に include_once の代わりに include を使用する方が良いというものでした。これまで最も一般的な理由は include_once でした。ロードされたファイルのリストをクエリし、存在するかどうかを確認して、再度ロードする必要があります。
確かにこの理由は正しいのですが、今日話したいのは別の理由です
ファイルがロードされているかどうかを判断するには、PHP はファイルの open_path を取得する必要があることがわかっています。これは、たとえば次のことを意味します:
その後、opened_path を取得した後、PHP はロードされたファイルのリストにアクセスして、それが含まれているかどうかを確認し、ファイルを開く必要はなくなります。ファイルの絶対パスを解析するには、正常に解析できた場合は EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します
2. ファイルを開き、ファイルのオープン パス (開いたパス) を取得します。 )
3. EG (include_files) への開いたパスを使用して存在するかどうかを確認し、存在する場合は戻り、存在しない場合は続行します4. ファイルをコンパイルします (compile_file)。
これはほとんどの場合問題になりませんが、APC を使用する場合に問題が発生します...
APC を使用する場合、APC はコンパイル済みファイルのポインタをハイジャックします。
ただし、コード内で include_once を使用すると、PHP は、compile_file の前にすでにファイルを開こうとしているため、APC によってハイジャックされたコンパイル ファイルが入力され、APC はこれを解決するために include_once_override を導入します。この問題は、include_once_override がオンになっている場合、APC は PHP の ZEND_INCLUDE_OR_EVAL オペコード ハンドラーをハイジャックし、stat を通じてファイルの絶対パスを決定し、ファイルがロードされていないことが判明した場合は、オペコードを書き換えてインクルードします。難しい解決策
しかし、残念ながら、先ほども言ったように、APC の include_once_override は十分に実装されておらず、次のような未定義の問題がいくつか発生するでしょう:
コードをコピーしてください
コードは次のとおりです:
http://www.bkjia.com/PHPjc/327410.htmlwww.bkjia.com
true