Как получить домашний каталог из PHP CLI script?

Из командной строки я могу получить домашний каталог следующим образом:

~/

Как я могу получить домашний каталог внутри моего PHP CLI script?

#!/usr/bin/php
<?php
echo realpath(~/);
?>

Ответ 1

Используйте $_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
    )

Надеюсь, я не буду раскрывать соответствующую информацию о безопасности;)

Совместимость с Windows

Обратите внимание, что $_SERVER['HOME'] недоступно в Windows. Вместо этого переменная разделяется на $_SERVER['HOMEDRIVE'] и $_SERVER['HOMEPATH'].

Ответ 2

Вы можете получить значение $HOME из среды:

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

Ответ 3

Эта функция взята из проекта 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;
}

Ответ 4

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); 

Документация

Ответ 5

Если по какой-либо причине 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;
}

Ответ 6

Зависит от того, где вы находитесь и что вы пытаетесь сделать.

$_SERVER полностью ненадежен для не-сервера script, НО $_ENV['HOME'] может быть лучше для стандартной оболочки script. Вы всегда можете print_r( $GLOBALS ) и посмотреть, с чем ваша среда дает вам возможность играть. phpinfo() также выплескивает plaintxt при вызове из CLI script, и только хороший ole php -i, выполненный из оболочки, сделает то же самое.

Ответ 7

Это метод, который я использовал в недавнем проекте:

exec('echo $HOME')

Я сохранил его в свой объект, выполнив следующее:

$this->write_Path  = exec('echo $HOME');

Но вы можете действительно сохранить его так, как хотите, и использовать его в любом случае.

Ответ 8

$_ SERVER ['HOME'] и getenv ('home') не работают для меня.

Однако, на PHP 5.5+, это сработало, чтобы дать домашнему каталогу, что файл находится в:

explode( '/', __FILE__ )[2]

Ответ 9

Попробуйте $_SERVER['DOCUMENT_ROOT'] как ваш домашний каталог.

Ответ 10

dirname(__DIR__);