【问题标题】:Get parent directory of running script获取运行脚本的父目录
【发布时间】:2010-12-25 07:40:32
【问题描述】:

在 PHP 中,获取当前运行脚本相对于 www 根目录的 目录的最简洁方法是什么?假设我有:

$_SERVER['SCRIPT_NAME'] == '/relative/path/to/script/index.php'

或者只是:

$something_else == '/relative/path/to/script/'

我需要正确插入斜线的/relative/path/to/。你有什么建议?首选单线。

编辑

我需要获得一个相对于 www 根目录的路径,dirname(__FILE__) 给了我一个文件系统中的绝对路径,所以这不起作用。另一方面,$_SERVER['SCRIPT_NAME'] 在 www 根目录“开始”。

【问题讨论】:

    标签: php directory


    【解决方案1】:

    我希望这会有所帮助

    function get_directory(){
        $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
        $protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0, strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")) . $s;
        $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
    return $protocol . "://" . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']);
    }
    define("ROOT_PATH", get_directory()."/" );
    echo ROOT_PATH;
    

    【讨论】:

      【解决方案2】:

      我希望这会对你有所帮助。

      echo getcwd().'<br>'; // getcwd() will return current working directory
      echo dirname(getcwd(),1).'<br>';
      echo dirname(getcwd(),2).'<br>';
      echo dirname(getcwd(),3).'<br>';
      

      输出:

      C:\wamp64\www\public_html\step
      C:\wamp64\www\public_html
      C:\wamp64\www
      C:\wamp64
      

      【讨论】:

        【解决方案3】:

        这是我使用的一个功能。创建一次,所以我总是有这个功能:

        function getDir(){
            $directory = dirname(__FILE__);
            $directory = explode("/",$directory);
            $findTarget = 0;
            $targetPath = "";
            foreach($directory as $dir){
                if($findTarget == 1){
                    $targetPath = "".$targetPath."/".$dir."";
                }
                if($dir == "public_html"){
                    $findTarget = 1;
                }
            }
            return "http://www.".$_SERVER['SERVER_NAME']."".$targetPath."";
        }
        

        【讨论】:

        • 如果我理解得很好,这个脚本会寻找“public_html”的绝对路径。在这种情况下,'=='符号不应该被'!='代替吗?
        【解决方案4】:

        这也是一种可能的解决方案

        $relative = '/relative/path/to/script/';
        $absolute = __DIR__. '/../' .$relative;
        

        【讨论】:

          【解决方案5】:

          获取当前脚本的父目录。

          $parent_dir = dirname(__DIR__);
          

          【讨论】:

            【解决方案6】:

            从 PHP 5.3.0 开始,您可以使用 __DIR__ 来实现此目的。

            文件的目录。如果在包含内使用,则目录 返回包含的文件。这相当于 目录名(__ FILE__)。

            PHP Magic constants

            C:\www>php --version
            PHP 5.5.6 (cli) (built: Nov 12 2013 11:33:44)
            Copyright (c) 1997-2013 The PHP Group
            Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
            
            C:\www>php -r "echo __DIR__;"
            C:\www
            

            【讨论】:

              【解决方案7】:

              试试这个。 适用于 windows 或 linux 服务器..

              str_replace('\\','/',目录名(目录名(__FILE__)))

              【讨论】:

                【解决方案8】:

                丑陋,但这会做到:

                substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])))
                

                【讨论】:

                  【解决方案9】:

                  这是我使用的,因为我没有运行> 5.2

                  function getCurrentOrParentDirectory($type='current')
                  {
                      if ($type == 'current') {
                          $path = dirname(__FILE__);  
                      } else {
                          $path = dirname(dirname(__FILE__));
                      }
                      $position = strrpos($path, '/') + 1;
                      return substr($path, $position);
                  }
                  

                  @mike b 为父目录建议的带有文件的双目录名,并且只需使用该语法一次即可找到当前目录。

                  注意这个函数只返回名字,后面必须加上斜线。

                  【讨论】:

                    【解决方案10】:

                    如果我正确理解了您的问题,假设您的运行脚本是

                    /relative/path/to/script/index.php
                    

                    这将为您提供运行脚本相对于文档 www 的父目录:

                    $parent_dir = dirname(dirname($_SERVER['SCRIPT_NAME'])) . '/';
                    //$parent_dir will be '/relative/path/to/'
                    

                    如果您希望运行脚本的父目录相对于服务器根目录:

                    $parent_dir = dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . '/';
                    //$parent_dir will be '/root/some/path/relative/path/to/'
                    

                    【讨论】:

                    • 嗨!我之前曾尝试过问这个问题...在结尾处添加斜杠或省略它是常见的做法吗?我喜欢省略它,因为:$url = BASE_URL . '/my/path/'; 在我看来比 $url = BASE_URL . 'my/path/'; 更好。有标准方法还是最常见的方法?
                    • @nbrogi:我喜欢总是添加它,所以你可以立即看到它是一个目录/文件夹,而不是没有扩展名的文件名。
                    【解决方案11】:

                    我自己搞定了,虽然有点笨拙但很有效:

                    substr(dirname($_SERVER['SCRIPT_NAME']), 0, strrpos(dirname($_SERVER['SCRIPT_NAME']), '/') + 1)
                    

                    所以如果我有/path/to/folder/index.php,这将导致/path/to/

                    【讨论】:

                    • 我不明白您只需调用两次dirname 即可到达父目录,请参阅我的回答。
                    【解决方案12】:

                    如果您的脚本位于/var/www/dir/index.php,则将返回以下内容:

                    dirname(__FILE__); // /var/www/dir
                    

                    dirname( dirname(__FILE__) ); // /var/www
                    

                    编辑

                    这是一种在许多框架中用于确定来自 app_root 的相对路径的技术。

                    文件结构:

                    /var/ 万维网/ 索引.php 子目录/ 库.php

                    index.php 是我的调度程序/引导文件,所有请求都被路由到:

                    define(ROOT_PATH, dirname(__FILE__) ); // /var/www
                    

                    library.php 是位于额外目录下的某个文件,我需要确定相对于应用程序根目录 (/var/www/) 的路径。

                    $path_current = dirname( __FILE__ ); // /var/www/subdir
                    $path_relative = str_replace(ROOT_PATH, '', $path_current); // /subdir
                    

                    可能有比str_replace() 更好的方法来计算相对路径,但你明白了。

                    【讨论】:

                    • 这行不通,因为我需要相对于 www 根目录的路径。我可以将 /var/www 部分替换掉,但这需要在 Windows 和 *nix 上工作。
                    • 没有可靠的方法来确定所有服务器上所有操作系统上的 ROOT_PATH。最佳实践技术是在堆栈的早期define(ROOT_PATH, dirname(__FILE__));(希望您使用通用调度程序或引导程序,这样实现起来不会很麻烦)并将其与其他函数结合使用以生成相对路径。
                    • 就我而言,情况正好相反。所有请求都路由到/something/cms/index.php,因此从那里设置ROOT_PATH会导致/something/cms/,我需要访问父目录/something/。所以我想我只能求助于一些丑陋的字符串操作。
                    • 我一直使用$_SERVER['SCRIPT_NAME'] 来获取目录,但我喜欢这个主意。很好的答案。
                    • 从 PHP 7.0.0 开始,可以使用 dirname(__FILE__, 2) 代替 dirname(dirname(__FILE__))dirname Changelog
                    【解决方案13】:
                    $dir = dirname($file) . DIRECTORY_SEPARATOR;
                    

                    【讨论】:

                    • 但是DIRECTORY_SEPARATOR define 不是没必要吗? PHP 似乎在 Windows 机器上也适用于两种类型的斜杠`/\`。
                    猜你喜欢
                    • 2014-06-30
                    • 2017-04-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-12
                    • 2023-03-29
                    • 1970-01-01
                    • 2011-03-23
                    相关资源
                    最近更新 更多