From the command line, I can get the home directory like this:
~/
How can I get the home directory inside my PHP CLI script?
#!/usr/bin/php
asked Dec 12, 2009 at 22:33
Use $_SERVER['HOME']
Edit:
To make it complete, see what print_r[$_SERVER]
gave me, executed from the command line:
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
]
I hope I don't expose relevant security information ;]
Windows Compatibility
Note that $_SERVER['HOME']
is not available on Windows. Instead, the variable is split into $_SERVER['HOMEDRIVE']
and $_SERVER['HOMEPATH']
.
answered Dec 12, 2009 at 22:46
Felix KlingFelix Kling
769k171 gold badges1068 silver badges1114 bronze badges
8
You can fetch the value of $HOME from the environment:
answered Aug 4, 2011 at 18:54
EJ CampbellEJ Campbell
6555 silver badges4 bronze badges
2
PHP allows you to get the home dir of any of the OS users. There are 2 ways.
Method #1:
First of all you gotta figure out the OS User ID and store it somewhere [ database or a config file for instance].
// Obviously this gotta be ran by the user which the home dir
// folder is needed.
$uid = posix_getuid[];
This code bit can be ran by any OS user, even the usual webserver www-data user, as long as you pass the correct target user ID previously collected.
$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];
Documentation
Method #2:
Same logic from posix_getpwuid[]. Here you gotta pass the target OS username instead of their 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];
Documentation
answered Jun 18, 2015 at 22:22
Francisco LuzFrancisco Luz
2,5732 gold badges24 silver badges35 bronze badges
6
This function is taken from the 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;
}
answered Sep 11, 2015 at 16:46
ya.teckya.teck
1,80227 silver badges32 bronze badges
If for any reason getenv['HOME']
isn't working, or the server OS is Windows, you can use exec["echo ~"]
or exec["echo %userprofile%"]
to get the user directory. Of course the exec
function has to be available [some hosting companies disable that kind of functions for security reasons, but that is more unlikely to happen].
Here is a
php function that will try $_SERVER
, getenv
and finally check if the exec
function exists and use the appropriate system command to get the user directory:
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;
}
answered Jan 21, 2018 at 14:14
Christos LytrasChristos Lytras
34.7k4 gold badges70 silver badges103 bronze badges
7
Depends on where you are and what you're trying to do.
$_SERVER
is completely unreliable for a
non-server script, BUT $_ENV['HOME']
might be better for a standard shell script. You can always print_r[ $GLOBALS ]
and see what your environment gives you to play with. phpinfo[]
also spits out plaintxt when called from a CLI script, and just good ole php -i
executed from a shell will do the same.
Tim Cooper
153k37 gold badges320 silver badges272 bronze badges
answered Jul 26, 2011 at 18:42
This works for me both LINUX and 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;
}
answered Nov 12, 2020 at 19:39
1
This is the method i used in a recent project:
exec['echo $HOME']
I saved it into my object by doing this:
$this->write_Path = exec['echo $HOME'];
But you could really save it any way you want and use it anyway you see fit.
answered Mar 8, 2018 at 17:40
dustbusterdustbuster
71.9k7 gold badges19 silver badges38 bronze badges
1
You can rely on "home" directory when working with web server. Working CLI it will give the user path [in windows] if you want your script to work in web and cli environments I've found better to go up any levels with dirname until your root[home] directory.
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
answered Jul 4, 2020 at 14:43
lisandrolisandro
3862 silver badges10 bronze badges
1
I know that this is an old question, but if you are looking for an alternative and easy to replicate method across your application, you may consider using a library installed via composer. I've written a library that combine some of the answer here and make it a library and I'll shamelessly promote it here : juliardi/homedir.
You can install it via composer :
$ composer require juliardi/homedir
And then use it in your application :