获取服务器的根路径

Getting Server's Root Path

获取站点文件夹的根目录并不困难,但我试图获取所有站点所在的文件夹,而不是特定站点的根文件夹。我一直在使用下面的代码,但我遇到了一个影响 $CommonPath 的实例,由于某个站点的特定结构,它无法正常工作。

换句话说,我的一个 Windows 开发系统是这样的:

C:\Server\Sites\site1.loc
C:\Server\Sites\site2.loc
C:\Server\Sites\site3.loc

另一个基于Linux的开发系统有:

/var/www/html/site1.loc
/var/www/html/site2.loc
/var/www/html/site3.loc

我正在尝试从这些根的一两个子文件夹中的代码中获取 C:\Server\Sites\ 或 /var/www/html/。如何在不必指定在哪个子文件夹中创建变量的情况下完成?

$SiteFolder = @end(explode(DIRECTORY_SEPARATOR, dirname(__DIR__)));
$CommonPath = str_replace($SiteFolder,"",dirname(__DIR__)) . "common" . DIRECTORY_SEPARATOR;
$ConfigPath = dirname(__DIR__) . DIRECTORY_SEPARATOR . "configuration" . DIRECTORY_SEPARATOR;
$FunctionsPath = dirname(__DIR__) . DIRECTORY_SEPARATOR . "functions" . DIRECTORY_SEPARATOR;

你可以看看这个:

realpath — Returns canonicalized absolute pathname

http://php.net/manual/en/function.realpath.php

如果 path/file 不存在,这将 return 为假。

<?php
   echo realpath('/windows/system32');

   echo realpath('C:\Program Files\');
?>

输出:

C:\WINDOWS\System32
C:\Program Files


添加参考:
这也可能对您有所帮助:Get 'My Documents' path in windows using php

我终于让它工作了,首先为站点的根目录创建一个变量,然后在目录分隔符上展开并只获取最后一位,然后将其从路径中过滤掉。也许它不是最优雅的代码,但它似乎有效。

$dirSeparator = DIRECTORY_SEPARATOR;
$serverRoot = str_replace("/",$dirSeparator,$_SERVER['DOCUMENT_ROOT']);
$SiteFolder = end(explode($dirSeparator,$serverRoot));
$CommonPath = str_replace($SiteFolder,"",$serverRoot);

我不确定为什么我不能直接使用 DIRECTORY_SEPARATOR,但为它创建一个变量确实有效。此外,可能还有一个 PHP 错误,在 Windows 服务器上使用 $_SERVER['DOCUMENT_ROOT'] 仍然会提供 Linux 目录分隔符,因此我不得不做一个 str_replace() 来解决这个问题。

我需要做这一切的原因是为了能够包含具有别名文件夹中多个站点共有功能的文件,所以我的实际代码是这样的:

$CommonPath = str_replace($SiteFolder,"",$serverRoot) . "common" . $dirSeparator;

如果可以避免,不建议将“stfu 运算符”(@) 与 end() 一起使用。

我可能会推荐字符串函数而不是临时数组操作:

代码:(Demo)

$document_roots = [
    "C:\Server\Sites\site1.dev",
    "C:/Server/Sites/site1",
    "/var/www/html/site1.dev"
];

foreach ($document_roots as $document_root) {
    $prepared = str_replace("\","/",$document_root);
    echo substr($prepared,0,strrpos($prepared,"/"));
    echo " or ";
    echo preg_replace("~/[^/]*$~","",$prepared);
    echo "\n";
}

输出:

C:/Server/Sites or C:/Server/Sites
C:/Server/Sites or C:/Server/Sites
/var/www/html or /var/www/html