如何在PHP和Windows上以Windows和Linux查找用户的主目录

我知道有几种方法可以确定用户的家,这取决于平台(主要是Unix / Linux vs Windows)。

Composer在composer/Platform包中使用环境变量:

public static function getUserDirectory()
{
    if (false !== ($home = getenv('HOME'))) {
        return $home;
    }
    if (self::isWindows() && false !== ($home = getenv('USERPROFILE'))) {
        return $home;
    }
    if (function_exists('posix_getuid') && function_exists('posix_getpwuid')) {
        $info = posix_getpwuid(posix_getuid());
        return $info['dir'];
    }
    throw new \RuntimeException('Could not determine user directory');
}

public static function isWindows()
{
    return defined('PHP_WINDOWS_VERSION_BUILD');
}

Webmozart's path-util包使用其他环境变量:

public static function getHomeDirectory()
{
    // For UNIX support
    if (getenv('HOME')) {
        return static::canonicalize(getenv('HOME'));
    }
    // For >= Windows8 support
    if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) {
        return static::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH'));
    }
    throw new RuntimeException("Your environment or operation system isn't supported");
}

这两种方法有什么区别?一个比另一个更可靠吗?注意:我在CLI中使用PHP,因此它始终是运行PHP的实际当前用户。

编辑>我明白这个问题似乎要求一个意见,但事实并非如此。我不知道Windows,也不明白为什么有些软件包使用不同的方法来确定用户的主目录。我要求解释两种提到的方法:其中一种比另一种更可靠,为什么?我编辑了标题和问题以反映这种精确度。

0
投票

在长时间不工作之后,我终于决定肯定回答这个问题了。

在Windows上定义了一些有用的环境变量:USERPROFILEAPPDATALOCALAPPDATA。可以通过getenv()函数轻松访问它们:

getenv('USERPROFILE');

根据USERPROFILE的说法,https://docs.microsoft.com/fr-fr/windows/desktop/shell/knownfolderid存在于任何Windows上

因此,在Windows上,它似乎是可靠的。

如果您需要为当前用户存储数据,APPDATALOCALAPPDATA是找到该位置的好变量。

我写了一个包,让这些工具可以重复使用:https://github.com/Arcesilas/Platform

它仍在进行中,当然需要改进。欢迎任何帮助,使该工具在任何平台上都可靠。

感谢eryksun,他的评论在解决这个问题上提供了很多帮助。