0

获取站点文件夹的根目录并不困难,但我试图获取所有站点所在的文件夹,而不是特定站点的根文件夹。我一直在使用下面的代码,但我遇到了一个影响 $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;
4

3 回答 3

0

你可以看看这个:

realpath — 返回规范化的绝对​​路径名

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

如果路径/文件不存在,这将返回 false。

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

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

输出

C:\WINDOWS\System32
C:\Program Files


添加的参考:
这也可以帮助您: Get 'My Documents' path in windows using php

于 2018-01-20T07:53:08.270 回答
0

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

$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;
于 2018-01-20T21:51:44.367 回答
0

在可以避免的情况下,不建议使用“ stfu运算符”( @) 。end()

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

代码:(演示

$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
于 2018-03-12T02:51:11.157 回答