我了解有多种方法可以确定用户的家,具体取决于平台(主要是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,也不明白为什么有些软件包使用不同的方法来确定用户的主目录。我要求解释两种提到的方法:其中一种比另一种更可靠,为什么? 我已经编辑了标题和问题以反映这种精确度。
答案 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>
,USERPROFILE
,APPDATA
。可通过getenv()函数轻松访问它们:
LOCALAPPDATA
根据{{3}} , getenv('USERPROFILE');
在任何Windows上都存在
因此,在Windows上,它似乎是可靠的。
如果您需要存储当前用户的数据,USERPROFILE
和APPDATA
是找到该位置的好变量。
我编写了一个程序包使这些工具可重复使用:https://docs.microsoft.com/fr-fr/windows/desktop/shell/knownfolderid
它仍在进行中,当然需要改进。欢迎任何帮助,以使该工具在任何平台上均可靠。
感谢eryksun的评论对解决这个问题有很大帮助。