1

requireまたはを使用しようとするとrequire_once、必要なファイルが同じサブディレクトリにある場合は正常に機能しますが、サブディレクトリの外にあるファイルを見つけた瞬間に致命的なエラーが発生します。基本的に、ファイル ツリーは次のようになります。

* main.php
+ login/
   * login.php
+ includes/
   * session.php

...基本的に、main.php が login/login.php を要求するようにすれば問題ありませんが、login.php が includes/session.php を要求するようにディレクトリ トラバーサルを実行しようとすると失敗し、エラー:

PHP 致命的なエラー: require_once(): 必要なファイルを開くのに失敗しました [...]

この概念のコードは次のようになります。

require('login/login.php') #works fine (main.php)
require('../includes/session.php') #quits (login.php)

$_SERVER('DOCUMENT_ROOT')$_SERVER('SERVER_ADDR')dir(_FILE_)、およびを使用してみchdir(../)ました。数か月前にこの問題を解決したプロジェクトに取り組んだことを覚えています。これはファイルパスをトラバースする単純な関数でしたが、もう見つかりません。何か案は?

4

2 に答える 2

3

を使用するset_include_path()と、あなたの生活がずっと楽になります。

于 2010-10-31T04:50:24.637 に答える
1

これは再帰ではなく、単純な古いディレクトリ トラバーサルです。

include/require には絶対に相対パスを使用しないでください。スクリプトがどのディレクトリから呼び出されたかはわからないため、間違った作業ディレクトリにいる可能性が常にあります。これは頭​​痛のレシピです。

dirname(__FILE__)現在のファイルがあるディレクトリの絶対パスを取得するために常に使用します。PHP 5.3 を使用している場合は、そのまま実行できます__DIR__。(前後に 2 つのアンダースコアがあることに注意してください。)

require dirname(__FILE__).'/../includes/session.php';

(ちなみに、 include/require は関数ではなく言語構造であるため、括弧で囲む必要はありません。)

絶対パスを使用すると、PHP が .xml 内のすべてのディレクトリを調べる必要がないため、パフォーマンスが向上する場合もありますinclude_path。(ただし、これは、 に複数のディレクトリがある場合にのみ適用されますinclude_path。)

于 2010-10-31T04:55:52.003 に答える