2011-12-02 289 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', 
)