Из командной строки я могу получить домашний каталог следующим образом:
~/
Как я могу получить домашний каталог внутри моего PHP CLI script?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
Из командной строки я могу получить домашний каталог следующим образом:
~/
Как я могу получить домашний каталог внутри моего PHP CLI script?
#!/usr/bin/php
<?php
echo realpath(~/);
?>
Используйте $_SERVER['HOME']
Edit:
Чтобы сделать это, посмотрите, что мне дал 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']
.
Вы можете получить значение $HOME из среды:
<?php
$home = getenv("HOME");
?>
Эта функция взята из проекта Drush.
/**
* Return the user home directory.
*/
function drush_server_home() {
// Cannot use $_SERVER superglobal since that 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 does not happen.
$home = rtrim($home, '\\/');
}
return empty($home) ? NULL : $home;
}
PHP позволяет получить домашний каталог любого из пользователей ОС. Есть 2 способа.
Способ № 1:
Прежде всего, вам нужно выяснить идентификатор пользователя ОС и сохранить его где-нибудь (например, базу данных или файл конфигурации).
// Obviously this gotta be ran by the user which the home dir
// folder is needed.
$uid = posix_getuid();
Этот бит кода может быть запущен любым пользователем ОС, даже обычным пользователем веб-сервера 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);
Если по какой-либо причине 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
полностью ненадежен для не-сервера script, НО $_ENV['HOME']
может быть лучше для стандартной оболочки script. Вы всегда можете print_r( $GLOBALS )
и посмотреть, с чем ваша среда дает вам возможность играть. phpinfo()
также выплескивает plaintxt при вызове из CLI script, и только хороший ole php -i
, выполненный из оболочки, сделает то же самое.
Это метод, который я использовал в недавнем проекте:
exec('echo $HOME')
Я сохранил его в свой объект, выполнив следующее:
$this->write_Path = exec('echo $HOME');
Но вы можете действительно сохранить его так, как хотите, и использовать его в любом случае.
$_ SERVER ['HOME'] и getenv ('home') не работают для меня.
Однако, на PHP 5.5+, это сработало, чтобы дать домашнему каталогу, что файл находится в:
explode( '/', __FILE__ )[2]
Попробуйте $_SERVER['DOCUMENT_ROOT']
как ваш домашний каталог.
dirname(__DIR__);