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

时间:2018-02-15 00:41:06

标签: php linux windows cross-platform

我了解有多种方法可以确定用户的家,具体取决于平台(主要是Unix / Linux与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,也不明白为什么有些软件包使用不同的方法来确定用户的主目录。我要求解释两种提到的方法:其中一种比另一种更可靠,为什么? 我已经编辑了标题和问题以反映这种精确度。

1 个答案:

答案 0 :(得分:0)

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

在Windows上定义了一些有用的环境变量:<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/keyboard_pressed"/> </shape> USERPROFILEAPPDATA。可通过getenv()函数轻松访问它们:

LOCALAPPDATA
根据{{​​3}}

getenv('USERPROFILE'); 在任何Windows上都存在

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

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

我编写了一个程序包使这些工具可重复使用:https://docs.microsoft.com/fr-fr/windows/desktop/shell/knownfolderid

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

感谢eryksun的评论对解决这个问题有很大帮助。