PHP absolute path to root

后端 未结 7 1887
轻奢々
轻奢々 2020-11-28 05:44

I can\'t believe PHP doesn\'t have an easy solution for this simple matter. ASP.NET has a ~ sign that takes care of this issue and starts everything from the root level. Her

相关标签:
7条回答
  • 2020-11-28 06:11

    use dirname(__FILE__) in a global configuration file.

    0 讨论(0)
  • 2020-11-28 06:12

    You can access the $_SERVER['DOCUMENT_ROOT'] variable :

    <?php 
       $path = $_SERVER['DOCUMENT_ROOT'];
       $path .= "/subdir1/yourdocument.txt";
    ?>
    
    0 讨论(0)
  • 2020-11-28 06:16

    Create a constant with absolute path to the root by using define in ShowInfo.php:

    define('ROOTPATH', __DIR__);
    

    Or PHP <= 5.3

    define('ROOTPATH', dirname(__FILE__));
    

    Now use it:

    if (file_exists(ROOTPATH.'/Texts/MyInfo.txt')) {
      // ...
    }
    

    Or use the DOCUMENT_ROOT defined in $_SERVER:

    if (file_exists($_SERVER['DOCUMENT_ROOT'].'/Texts/MyInfo.txt')) {
      // ...
    }
    
    0 讨论(0)
  • 2020-11-28 06:25

    It always best to start any custom PHP project with a bootstrap file where you define the most commonly used paths as constants, based on values extracted from $_SERVER. It should make migrating your projects or parts of your project to another server or to another directory on the server a hell of a lot easier.

    This is how I define my root paths :

    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_'));
    

    The path LOCAL_PATH_ROOT is the document root. The path HTTP_PATH_ROOT is the equivalent when accessing the same path via HTTP.

    At that point, converting any local path to an HTTP path can be done with the following code :

    str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path)
    

    If you want to ensure compatibility with Windows based servers, you'll need to replace the directory seperator with a URL seperator as well :

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

    Here's the full bootstrap code that I'm using for the 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);
    

    If you add the above code to your own project, outputting all user constants at this point (which you can do with get_defined_constants(true) should give a result that looks somewhat like this :

    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',
    )
    
    0 讨论(0)
  • 2020-11-28 06:33

    The best way Using dirname(). Because SERVER['DOCUMENT_ROOT'] not working all servers, and also return server running path.

    $root = dirname( __FILE__ );
    
    $root = __DIR__;
    
    $filePath = realpath(dirname(__FILE__));
    
    $rootPath = realpath($_SERVER['DOCUMENT_ROOT']);
    
    $htmlPath = str_replace($root, '', $filePath);
    
    0 讨论(0)
  • 2020-11-28 06:35

    The best way to do this given your setup is to define a constant describing the root path of your site. You can create a file config.php at the root of your application:

    <?php
    
    define('SITE_ROOT', dirname(__FILE__));
    
    $file_path = SITE_ROOT . '/Texts/MyInfo.txt';
    
    ?>
    

    Then include config.php in each entry point script and reference SITE_ROOT in your code rather than giving a relative path.

    0 讨论(0)
提交回复
热议问题