2011-12-02 290 views
12

如果我使用絕對路徑,我無法將整個目錄移動到新位置。 如果我使用相對路徑,我無法將單個文件移動到新位置。絕對與相對路徑

這裏有什麼解決方案?你是否設置了一個保存根路徑的配置文件並從那裏開始?或者你有像這樣的規則:永遠不要移動文件?

我在某些項目中看到人們使用dirname(FILE)。這是什麼意思,我的意思是,爲什麼不直接離開它,因爲無論如何dirname是相對的(取決於文件的位置)?

+0

使用目錄名的'( __FILE __)'或'__DIR__'即使包含文件,它仍然會返回當前腳本的目錄。如果您有一個包含dir/script.php的文件,script.php中的默認包含路徑將是根目錄,而不是dir /。 – Kokos

+1

@Frank Vilea:*您是否設置了一個配置文件來保存根路徑並從那裏開始?**是** –

+0

我對這個自己很不好,但我想這個想法是將這兩個混合起來。在主腳本中添加絕對路徑,並在腳本中包含和使用的文件中添加相對路徑。當然,你不能使用相對路徑移動任何文件而不改變相對路徑聲明中的某些內容。 – OptimusCrime

回答

14

你應該使用將包含在每個文件的第一行一個配置文件,例如您的應用程序看起來像這樣

根/應用/插件

你的根目錄裏:app-config.php

if (!defined('ABSPATH')) 
    define('ABSPATH', dirname(__FILE__) . '/'); 

現在,假設你有一個包含插件文件,所以

你的插件目錄裏:my-plugin.php

require_once '../../app-config.php'; 

現在一切都在此線下面可以使用ABSPATH

例如你現在要加載圖像

<img src='".ABSPATH."Public/images/demo.png' alt=''/> 

,事情更簡單,如果你的應用程序被設計爲自動加載一些像

plugin-widget-1.php 

這樣,該文件或任何其他內容由my-plugin.php文件加載的文件可以使用ABSPATH而不包括每次app-config.php文件。

考慮到這一點,你可以有一切你想要的簡寫成app-config.php例如

define('UPLOAD_PATH', ABSPATH. 'Public/uploads/'); 
define('IMAGES_PATH', ABSPATH. 'Public/images/'); 
define('HELPERS_PATH', ABSPATH. 'App/helpers/'); 
... 

所以,現在你都定義了,如果你需要移動文件,比方說一個文件夾向前例如:

根/應用/插件/的Utils

只是inlucde require_once '../../../app-config.php';

明顯我想塔如果你需要這樣做,那麼你每次都不改變路徑=)總是更簡單地改變一個文件包含而不是數百個。

希望這是有意義的,你=)

+0

我正在實施此解決方案。謝謝。 –

1

取決於您的使用,定義一個常量來保存應用程序路徑是常見的做法

不要使用變量,因爲它可能會在某個應用程序重寫,並可以把你的應用程序

是一個甚至更好用符號鏈接結合(象徵性的,以創建分支)

application dirs 
=============================== 
/home/latest   -> symlink 
/home/testing  -> symlink 
/home/20111202000000 -> latest development version 
/home/20111201000000 -> yesterday stable release 

所以,你可以符號鏈接
/家/測試 - > /首頁/ 201112.02億,同時保持穩定的版本錫永,
/首頁/最新 - > /首頁/ 201112.01億

有了這個,你沒有風險,破壞你的生產基地,同時做一些測試/開發,並且,你可以很容易地改變你的開發目錄

+0

我真的很喜歡這個解決方案。從來沒有想過使用符號鏈接。 –

2

我在某些項目中看到人們使用dirname(FILE)。這是什麼意思,我的意思是,爲什麼不直接離開它,因爲無論如何dirname是相對的(取決於文件的位置)?

無論如何,它都是相對於包含路徑的。 dirname(__FILE__)(或者PHP> = 5.3中的__DIR__)就在那裏,所以你可以從每個位置運行該文件。如果您使用相對路徑,則值「。」可能會改變。請參閱:

漿果@漿果-PC:〜%貓so.php

<?php 
var_dump(realpath('.')); 
var_dump(realpath(__DIR__)); 

漿果@漿果-PC:〜%PHP so.php

string(11) "/home/berry" 
string(11) "/home/berry" 

漿果@ berry-pc:〜%cd foo

berry @ berry-pc:〜/ foo%php .. /so.php

string(15) "/home/berry/foo" 
string(11) "/home/berry" 

因此,它是相對的,但它是相對於當前的工作目錄,而不是到該文件所在的目錄。這就是爲什麼你需要使用__DIR__這一點。順便說一下;是的,我不會將文件移動很多。如果我這樣做,我將不得不更新對該文件的每個調用,儘管我不需要或包含很多很多,因爲我使用的是Autoloader

至於我指的其他文件(如模板文件),我手動設置路徑,但一次。然後我參考$path . '/filename.php';,所以稍後更容易。

+2

感謝這個非常詳細的帖子。現在它是有道理的。自動加載功能看起來非常整齊。 –

+0

@Franketilea最受歡迎。 –

0

從性能的角度來看,當使用操作碼緩存或大量的require/include語句時,絕對路徑會更好(儘管當您開始包含數百個文件時,只有在使用像Zend/Symfony的/等)。

使用相對路徑,操作碼緩存和php必須每次處理文件實際路徑,然後才能解決它是否已知道文件以及是否需要重新加載文件。 PHP在內部維護一個文件散列圖到文件位置,只要不需要每次都進行上述計算,它就非常快速。

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訪問相同的路徑時,路徑HTTP_PATH_ROOT是等同的。

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path) 

如果你想確保基於Windows服務器的兼容性,你就需要更換目錄:

在這一點上,任何本地路徑轉換爲HTTP路徑可以用下面的代碼來完成用URL分隔符分隔符,以及:

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

下面是我使用的PHP PowerTools boilerplate完整的引導代碼:

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', 
)