2

作業中のサイトがあり、サイトのメイン ディレクトリに移動しようとしていますが、その設定方法がわかりません。私がやろうとしているのは、これを追加する方法を使用する代わりに、_inc/config.phpスルーを含めることです?/_inc/config.php../_inc/config.php

4

3 に答える 3

6

一般的に言えば、パスを処理する際に解決すべき 2 つの異なる問題があります。

  1. ファイルシステム パス (ファイルに使用する必要があるパスinclude)
  2. URL パス (アプリケーション内部の URL を作成するときに使用する必要があります)

これらは2つの異なる獣です。

ファイルシステムのパス

アプリケーションに単一のエントリ ポイントがある場合 (たとえばindex.php、URL クエリ文字列を調べた後に適切なビジネス ロジックに委任するもの)、次のことができます。

$ROOT_DIR = dirname(__FILE__);

そのファイル内に$ROOT_DIR.

アプリケーションに単一のエントリ ポイントがない場合、このオプションは使用できず、次の代替手段が残されます。

  1. どこでも相対パスを使用します (これは避けたいことです)。
  2. 現在のエントリ スクリプトから「パス解決」関数を呼び出し、スクリプトの相対パスをパラメーターとしてベース ディレクトリに渡します。次に例を示します。

    // for a script in $ROOT_DIR.'/commands' do this:

    $ROOT_DIR = resolve_root(__FILE__, DIRECTORY_SEPARATOR.'commands');

    追加の相対パス情報により、 のどの部分がアプリケーション ルートresolve_root($filename, $relative)であるかを把握できます。dirname($filename)ただし、この手法は扱いにくく、すべてのアプリケーション エントリ ポイント内に相対パス名をハードコーディングする必要があるため、使用しないことをお勧めします。

  3. 上記と同様に、アプリケーションの構成に「ルート」パスを含むハードコーディングされた変数が含まれている必要があります$ROOT_DIR。アプリケーションにインストーラーがある場合、インストール中に次のようにしてルート パスを正確に解決できます。

$installer_dir = dirname(__FILE__); // assume this is root path + "/install" $ROOT_DIR = realpath($installer_dir.DIRECTORY_SEPARATOR.'..');

インストーラーは、このパスをアプリケーション構成に書き込みます。アプリケーションにインストーラーがない場合は、構成へのベース パスを手動でハードコーディングするか、別のオプションを使用する必要があります。

を使用する$_SERVER['DOCUMENT_ROOT']ことは、この問題に対する満足のいく解決策ではありません。アプリケーションがドキュメント ルートにインストールされている場合にのみ、ジョブが実行されます。ドキュメント ルートが/var/wwwで、アプリケーションが にインストールされている場合、パス/var/www/appに追加する必要があることを知る方法はありません。/app

更新: Linux での実行について言及している回答についてpwd:そうしないでください。これまで。HTTP 要求ごとにシステム シェルを呼び出すと、ユーザーがリンクをクリックするよりも早く Web サーバーが停止します。既知の少数のユーザーがいて、パフォーマンスに対する実際の期待がない内部アプリケーションでは機能する可能性がありますが、迅速で汚れたソリューションで問題がない場合は、そのパスを単純にハードコーディングしてみませんか?

URL パス

実際のアプリケーション内では、アプリケーションのベース URL に関連する URL を作成する必要もあります (たとえば、 do <img src="$BASE_URL/images/icon.png" />)。

繰り返しになりますが、アプリケーションに単一のエントリ ポイント (例: index.php) がある場合は、 を使用$_SERVER['REQUEST_URI']してアプリケーションの「ベース」URL を解決できます。簡単な実装 (問題なく動作するはずです) は簡単です: URL パスの前に来る部分ですindex.php。ただし、さまざまな Web サーバーと PHP 構成の癖を回避する防弾実装は、やや複雑です。

アプリケーションに単一のエントリ ポイントがない場合は、ファイル システム パスと同じ問題が発生します。解決策も同じです。構成内の URL を手動でハードコードするか、インストール中にインストーラーにハードコードさせるか、必要に応じて相対パスのハードコードされた知識を使用して解決します。

于 2011-01-10T19:54:51.033 に答える
0

ファイルシステムまたは http を介した作業が含まれます。

include /some/file.php を使用すると、PHP はサーバーのルートを検索します。

使用できます

include $_SERVER['DOCUMENT_ROOT'] . '/some/file.php';

または、php.ini (または .htaccess) の open_basedir を変更することもできます。つまり、open_basedir=/some/where/ は、サーバーのルートまたはドキュメント ルートの代わりに、そのルート ディレクトリから /file.php を使用します。php.ini の「パスとディレクトリ」セクションも確認してください。

于 2011-01-10T19:20:45.780 に答える
0

私は絶対パスを使用しますが、ブートストラップ ファイルを使用してカスタム PHP プロジェクトを開始します$_SERVER

これは私のルートパスを定義する方法です:

define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_'));

パスLOCAL_PATH_ROOTはドキュメント ルートです。パスHTTP_PATH_ROOTは、HTTP 経由で同じパスにアクセスする場合と同等です。

その時点で、ローカル パスを HTTP パスに変換するには、次のコードを使用します。

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path)

Windows ベースのサーバーとの互換性を確保したい場合は、ディレクトリ区切り記号を URL 区切り記号に置き換える必要があります。

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path))

PHP PowerToolsボイラープレートに使用している完全なブートストラップ コードは次のとおりです。

defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__);

// -----------------------------------------------------------------------
// DEFINE SEPERATOR ALIASES
// -----------------------------------------------------------------------
define("URL_SEPARATOR", '/');
define("DS", DIRECTORY_SEPARATOR);
define("PS", PATH_SEPARATOR);
define("US", URL_SEPARATOR);

// -----------------------------------------------------------------------
// DEFINE ROOT PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_ROOT", '');
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT",
        isset($_SERVER["HTTP_HOST"]) ?
        $_SERVER["HTTP_HOST"] : (
        isset($_SERVER["SERVER_NAME"]) ?
        $_SERVER["SERVER_NAME"] : '_UNKNOWN_'));

// -----------------------------------------------------------------------
// DEFINE RELATIVE PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_BASE",
        str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd()));
define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE));
define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor');
define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE);
define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates');
define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config');
define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages');
define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets');
define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img');
define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css');
define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js');

// -----------------------------------------------------------------------
// DEFINE LOCAL PATHS
// -----------------------------------------------------------------------
define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE);
define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP);
define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY);
define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS);
define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE);
define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG);
define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES);
define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET);
define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS);

// -----------------------------------------------------------------------
// DEFINE URL PATHS
// -----------------------------------------------------------------------
if (US === DS) { // needed for compatibility with windows
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE);
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP);
    define("HTTP_PATH_LIBRARY", false);
    define("HTTP_PATH_HELPERS", false);
    define("HTTP_PATH_TEMPLATE", false);
    define("HTTP_PATH_CONFIG", false);
    define("HTTP_PATH_PAGES", false);
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET);
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS);
} else {
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_BASE));
    define("HTTP_PATH_APP", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_APP));
    define("HTTP_PATH_LIBRARY", false);
    define("HTTP_PATH_HELPERS", false);
    define("HTTP_PATH_TEMPLATE", false);
    define("HTTP_PATH_CONFIG", false);
    define("HTTP_PATH_PAGES", false);
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET));
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_IMG));
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_CSS));
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_JS));
}

// -----------------------------------------------------------------------
// DEFINE REQUEST PARAMETERS
// -----------------------------------------------------------------------
define("REQUEST_QUERY",
        isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ?
        $_SERVER["QUERY_STRING"] : false);
define("REQUEST_METHOD",
        isset($_SERVER["REQUEST_METHOD"]) ?
        strtoupper($_SERVER["REQUEST_METHOD"]) : false);
define("REQUEST_STATUS",
        isset($_SERVER["REDIRECT_STATUS"]) ?
        $_SERVER["REDIRECT_STATUS"] : false);
define("REQUEST_PROTOCOL",
        isset($_SERVER["HTTP_ORIGIN"]) ?
        substr($_SERVER["HTTP_ORIGIN"], 0,
        strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://');
define("REQUEST_PATH",
        isset($_SERVER["REQUEST_URI"]) ?
        str_replace(RELATIVE_PATH_BASE, '',
        $_SERVER["REQUEST_URI"]) : '_UNKNOWN_');
define("REQUEST_PATH_STRIP_QUERY",
        REQUEST_QUERY ?
        str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH);

// -----------------------------------------------------------------------
// DEFINE SITE PARAMETERS
// -----------------------------------------------------------------------
define("PRODUCTION", false);
define("PAGE_PATH_DEFAULT", US . 'index');
define("PAGE_PATH",
        (REQUEST_PATH_STRIP_QUERY === US) ?
        PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY);

上記のコードを独自のプロジェクトに追加すると、この時点ですべてのユーザー定数が出力されます (これget_defined_constants(true)により、次のような結果が得られるはずです。

array (
  'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples',
  'URL_SEPARATOR' => '/',
  'DS' => '/',
  'PS' => ':',
  'US' => '/',
  'RELATIVE_PATH_ROOT' => '',
  'LOCAL_PATH_ROOT' => '/var/www',
  'HTTP_PATH_ROOT' => 'localhost:8888',
  'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples',
  'RELATIVE_PATH_APP' => '/libraries/backend/Data',
  'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor',
  'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples',
  'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates',
  'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config',
  'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages',
  'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets',
  'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img',
  'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css',
  'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js',
  'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples',
  'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data',
  'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor',
  'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples',
  'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates',
  'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config',
  'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages',
  'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets',
  'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img',
  'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css',
  'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js',
  'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples',
  'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data',
  'HTTP_PATH_LIBRARY' => false,
  'HTTP_PATH_HELPERS' => false,
  'HTTP_PATH_TEMPLATE' => false,
  'HTTP_PATH_CONFIG' => false,
  'HTTP_PATH_PAGES' => false,
  'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets',
  'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img',
  'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css',
  'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js',
  'REQUEST_QUERY' => false,
  'REQUEST_METHOD' => 'GET',
  'REQUEST_STATUS' => false,
  'REQUEST_PROTOCOL' => 'http://',
  'REQUEST_PATH' => '/',
  'REQUEST_PATH_STRIP_QUERY' => '/',
  'PRODUCTION' => false,
  'PAGE_PATH_DEFAULT' => '/index',
  'PAGE_PATH' => '/index',
)
于 2014-11-08T15:36:07.807 に答える