如何从PHP CLI脚本获取主目录?

从命令行,我可以得到这样的主目录:

~/ 

我怎样才能得到我的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 ) 

我希望我不公开相关的安全信息;)

Windows兼容性

请注意, $_SERVER['HOME']在Windows上不可用。 相反,variables被分成$_SERVER['HOMEDRIVE']$_SERVER['HOMEPATH']

您可以从环境中获取$ HOME的值:

 <?php $home = getenv("HOME"); ?> 

该function取自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; } 

PHP允许你获得任何操作系统用户的主目录。 有两种方法。

方法#1:

首先你要弄清楚操作系统的用户名,并把它存储在某个地方(例如数据库或configuration文件)。

 // Obviously this gotta be ran by the user which the home dir // folder is needed. $uid = posix_getuid(); 

这个代码位可以由任何操作系统用户运行,即使是通常的networking服务器www数据用户,只要你传递了以前收集的正确的目标用户ID。

 $shell_user = posix_getpwuid($uid); print_r($shell_user); 

文档

方法2:

与posix_getpwuid()相同的逻辑。 在这里你必须传递目标操作系统的用户名,而不是他们的用户名。

 $shell_user = posix_getpwnam('johndoe'); print_r($shell_user); 

文档

取决于你在哪里以及你想做什么。

对于非服务器脚本, $_SERVER是完全不可靠的,但$_ENV['HOME']对于标准shell脚本可能更好。 你总是可以print_r( $GLOBALS ) ,看看你的环境给你玩什么。 phpinfo()也从CLI脚本调用时吐出plaintxt,只是从一个shell执行好的ole php -i会做同样的事情。

$ _SERVER ['HOME']和getenv('home')不适用于我。

但是,在PHP 5.5+上,这个工作可以给出文件所在的主目录:

 explode( '/', __FILE__ )[2] 

试试$_SERVER['DOCUMENT_ROOT']作为你的主目录。

 dirname(__DIR__);