【发布时间】:2009-12-12 22:33:44
【问题描述】:
从命令行,我可以像这样获取主目录:
~/
如何在我的 PHP CLI 脚本中获取主目录?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
【问题讨论】:
标签: php
从命令行,我可以像这样获取主目录:
~/
如何在我的 PHP CLI 脚本中获取主目录?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
【问题讨论】:
标签: php
使用$_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'] 在 Windows 上不可用。而是将变量拆分为$_SERVER['HOMEDRIVE'] 和$_SERVER['HOMEPATH']。
【讨论】:
$_SERVER 和 $_ENV 不起作用,请尝试 getenv("HOME")。
您可以从环境中获取 $HOME 的值:
<?php
$home = getenv("HOME");
?>
【讨论】:
这对我适用于 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;
}
【讨论】:
PHP 允许您获取任何操作系统用户的主目录。有两种方式。
方法#1:
首先,您必须找出操作系统用户 ID 并将其存储在某处(例如数据库或配置文件)。
// Obviously this gotta be ran by the user which the home dir
// folder is needed.
$uid = posix_getuid();
只要您传递之前收集的正确目标用户 ID,任何操作系统用户都可以运行此代码位,甚至是通常的网络服务器 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'],因为主目录是问题主题。
这个函数取自Drush project。
/**
* 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 功能必须可用(一些托管公司出于安全原因禁用了这种功能,但这种情况不太可能发生)。
这是一个php函数,它将尝试$_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 开头?
取决于你在哪里以及你想要做什么。
$_SERVER 对于非服务器脚本完全不可靠,但 $_ENV['HOME'] 对于标准 shell 脚本可能更好。你可以随时print_r( $GLOBALS ) 看看你的环境让你玩什么。 phpinfo() 在从 CLI 脚本调用时也会吐出 plaintxt,而从 shell 执行的良好 ole php -i 也会这样做。
【讨论】:
这是我最近一个项目中使用的方法:
exec('echo $HOME')
我通过这样做将它保存到我的对象中:
$this->write_Path = exec('echo $HOME');
但你真的可以以任何你想要的方式保存它,并以你认为合适的方式使用它。
【讨论】:
在使用 Web 服务器时,您可以依赖“主”目录。如果你希望你的脚本在 web 和 cli 环境中工作,它会提供用户路径(在 Windows 中),我发现最好使用 dirname 提升任何级别,直到你的根(主)目录。
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
【讨论】:
$_SERVER['HOME'] 和 getenv('home') 对我不起作用。
但是,在 PHP 5.5+ 上,这可以提供文件所在的主目录:
explode( '/', __FILE__ )[2]
【讨论】:
尝试将$_SERVER['DOCUMENT_ROOT'] 作为您的主目录。
【讨论】:
dirname(__DIR__);
【讨论】:
我知道这是一个老问题,但如果您正在寻找一种替代且易于在您的应用程序中复制的方法,您可以考虑使用通过 composer 安装的库。我已经编写了一个库,将这里的一些答案结合起来并使其成为一个库,我会在这里无耻地推广它:juliardi/homedir。
你可以通过 composer 安装它:
$ composer require juliardi/homedir
然后在你的应用程序中使用它:
<?php
require_once('vendor/autoload.php');
$userHomeDir = get_home_directory();
希望这个答案对你有所帮助。
【讨论】: