从命令行中,我可以通过以下命令获取主目录:
~/
如何在我的PHP CLI脚本中获取主目录?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
从命令行中,我可以通过以下命令获取主目录:
~/
如何在我的PHP CLI脚本中获取主目录?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
$_SERVER['HOME']
。
print_r($_SERVER)
所得到的结果:Array
(
[TERM_PROGRAM] => Apple_Terminal
[TERM] => xterm-color
[SHELL] => /bin/bash
[TMPDIR] => /var/folders/Lb/LbowO2ALEX4JTK2MXxLGd++++TI/-Tmp-/
[TERM_PROGRAM_VERSION] => 272
[USER] => felix
[COMMAND_MODE] => unix2003
[__CF_USER_TEXT_ENCODING] => 0x1F5:0:0
[PATH] =>/Library/Frameworks/Python.framework/Versions/Current/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
[PWD] => /Users/felix/Desktop
[LANG] => de_DE.UTF-8
[SHLVL] => 1
[HOME] => /Users/felix
[LOGNAME] => felix
[DISPLAY] => /tmp/launch-XIM6c8/:0
[_] => ./test_php2
[OLDPWD] => /Users/felix
[PHP_SELF] => ./test_php2
[SCRIPT_NAME] => ./test_php2
[SCRIPT_FILENAME] => ./test_php2
[PATH_TRANSLATED] => ./test_php2
[DOCUMENT_ROOT] =>
[REQUEST_TIME] => 1260658268
[argv] => Array
(
[0] => ./test_php2
)
[argc] => 1
)
$_SERVER['HOME']
。相反,该变量被分成$_SERVER['HOMEDRIVE']
和$_SERVER['HOMEPATH']
,这意味着如果您想要同时兼容Unix和Windows,请执行以下操作:$homepath = $_SEVER['HOME'] ?? (/*windows compatibility: */$_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH']);
// $homepath looks like /home/username or C:\Users\username
<?php
$home = getenv("HOME");
?>
PHP允许您获取任何操作系统用户的主目录。有两种方法。
方法#1:
首先,您需要找出操作系统用户ID并将其存储在某个地方(例如数据库或配置文件)。
// Obviously this gotta be ran by the user which the home dir
// folder is needed.
$uid = posix_getuid();
只要您事先收集到正确的目标用户ID,任何操作系统用户,甚至通常的Web服务器www-data用户都可以运行此代码片段。
$shell_user = posix_getpwuid($uid);
print_r($shell_user); // will show an array and key 'dir' is the home dir
// not owner of running script process but script file owner
$home_dir = posix_getpwuid(getmyuid())['dir'];
var_dump($home_dir);
方法 #2:
与 posix_getpwuid() 相同的逻辑。这里你需要传递目标操作系统用户名而不是他们的 UID。
$shell_user = posix_getpwnam('johndoe');
print_r($shell_user); // will show an array and key 'dir' is the home dir
// not owner of running script process but script file owner
$home_dir = posix_getpwnam(get_current_user())['dir'];
var_dump($home_dir);
$shell_user['dir']
,因为主目录是问题的主题。 - Hicaro这个函数取自Drush项目。
/**
* Return the user's home directory.
*/
function drush_server_home() {
// Cannot use $_SERVER superglobal since that's empty during UnitUnishTestCase
// getenv('HOME') isn't set on Windows and generates a Notice.
$home = getenv('HOME');
if (!empty($home)) {
// home should never end with a trailing slash.
$home = rtrim($home, '/');
}
elseif (!empty($_SERVER['HOMEDRIVE']) && !empty($_SERVER['HOMEPATH'])) {
// home on windows
$home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH'];
// If HOMEPATH is a root directory the path can end with a slash. Make sure
// that doesn't happen.
$home = rtrim($home, '\\/');
}
return empty($home) ? NULL : $home;
}
getenv('HOME')
不起作用,或者服务器操作系统是 Windows,则可以使用 exec("echo ~")
或 exec("echo %userprofile%")
来获取用户目录。当然,exec
函数必须可用 (某些托管公司出于安全考虑禁用了这种函数,但这种情况不太可能发生)。$_SERVER
、getenv
,最后检查 exec
函数是否存在,并使用适当的系统命令来获取用户目录:function homeDir()
{
if(isset($_SERVER['HOME'])) {
$result = $_SERVER['HOME'];
} else {
$result = getenv("HOME");
}
if(empty($result) && function_exists('exec')) {
if(strncasecmp(PHP_OS, 'WIN', 3) === 0) {
$result = exec("echo %userprofile%");
} else {
$result = exec("echo ~");
}
}
return $result;
}
$_SERVER['HOME']
或 getenv("HOME")
返回空值,那么没有主目录结果的事实?或者 PHP_OS
在Windows系统上以 WIN
开头? - Christos Lytras$_SERVER
完全不可靠,但对于标准 shell 脚本,$_ENV['HOME']
可能更好。您可以始终使用 print_r( $GLOBALS )
并查看您的环境提供了哪些内容供您使用。当从 CLI 脚本调用时,phpinfo()
也会输出纯文本,而只需从 shell 中执行好老的 php -i
即可做到这一点。这在LINUX和WINDOWS上都适用:
function get_home_path() {
$p1 = $_SERVER['HOME'] ?? null; // linux path
$p2 = $_SERVER['HOMEDRIVE'] ?? null; // win disk
$p3 = $_SERVER['HOMEPATH'] ?? null; // win path
return $p1.$p2.$p3;
}
HOME
和HOMEPATH
都被设置了怎么办? - Christian这是我在最近一个项目中使用的方法:
exec('echo $HOME')
我通过以下方式将其保存到我的对象中:
$this->write_Path = exec('echo $HOME');
但你可以按照自己的方式保存它,并以任何你认为合适的方式使用它。
在与 Web 服务器一起工作时,您可以依赖于“home”目录。如果您希望脚本在 Web 和 CLI 环境中都能正常工作,我发现最好使用 dirname 上升到根(home)目录。
当使用 CLI 时,它将为用户提供路径(在 Windows 中)。echo dirname(__DIR__).PHP_EOL; // one level up
echo dirname(dirname(__DIR__)); //two levels up
echo dirname(__DIR__,2).PHP_EOL; //two levels only php >7.0
/var/www/html
。 - Christian我知道这是一个老问题,但如果你正在寻找一种可在应用程序中轻松复制的替代方法,可以考虑使用通过composer安装的库。我编写了一个库,其中结合了一些答案,并将其制作成一个库,我会毫不羞耻地在这里推广:juliardi/homedir。
你可以通过composer安装它:
$ composer require juliardi/homedir
然后在您的应用程序中使用它:
<?php
require_once('vendor/autoload.php');
$userHomeDir = get_home_directory();
$_SERVER
和$_ENV
不起作用,尝试使用getenv("HOME")
。 - Andrea