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

时间:2009-12-12 22:33:44

标签: php

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

~/

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

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

13 个答案:

答案 0 :(得分:64)

使用$_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上不可用。相反,变量分为$_SERVER['HOMEDRIVE']$_SERVER['HOMEPATH']

答案 1 :(得分:50)

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

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

答案 2 :(得分:6)

此功能取自Drush project

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.SwingUtilities;

public class MainScreen2 extends Panel {
    private static final int PREF_W = 500;
    private static final int PREF_H = 500;

    public MainScreen2() {
        Panel bottomPanel = new Panel(new GridLayout(0, 1));
        bottomPanel.add(new Button("Start Game"));
        bottomPanel.add(new Button("How To Play"));
        bottomPanel.add(new Button("Settings"));
        bottomPanel.add(new Button("About"));

        setLayout(new BorderLayout());
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        Frame frame = new Frame("MainScreen2");
        frame.add(new MainScreen2());
        frame.pack();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                super.windowClosed(e);
                System.exit(0);
            }
        });
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

答案 3 :(得分:5)

PHP允许您获取任何OS用户的主目录。有两种方式。

方法#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);

Documentation

方法#2:

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

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

$home_dir = posix_getpwnam(get_current_user())['dir'];
var_dump($home_dir);

Documentation

答案 4 :(得分:2)

如果由于任何原因getenv('HOME')无法运行,或者服务器操作系统是Windows,您可以使用exec("echo ~")exec("echo %userprofile%")来获取用户目录。当然exec函数必须可用(出于安全原因,某些托管公司会禁用这类函数,但这种情况不太可能发生)

这是一个函数,它将尝试$_SERVERgetenv并最终检查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;
}

答案 5 :(得分:1)

取决于您的位置以及您想要做的事情。

对于非服务器脚本,

$_SERVER完全不可靠,但对于标准shell脚本,$_ENV['HOME']可能更好。您可以随时print_r( $GLOBALS )查看您的环境为您提供的服务。从CLI脚本调用时,phpinfo()也会吐出plaintxt,而从shell执行的良好的php -i也会执行相同的操作。

答案 6 :(得分:0)

这是我在最近的项目中使用的方法:

exec('echo $HOME')

我通过这样做将它保存到我的对象中:

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

但是你可以用你想要的任何方式保存它,无论如何你都认为合适。

答案 7 :(得分:0)

这对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;
}

答案 8 :(得分:0)

我知道这是一个古老的问题,但是如果您正在寻找一种跨应用程序且易于复制的方法,则可以考虑使用通过composer安装的库。我已经编写了一个库,将这里的一些答案组合在一起,并使其成为一个库,我将在这里无耻地推广它:juliardi/homedir

您可以通过composer安装它:

$ composer require juliardi/homedir

然后在您的应用程序中使用它:

<?php

require_once('vendor/autoload.php');

$userHomeDir = get_home_directory();

希望这个答案对您有所帮助。

答案 9 :(得分:-1)

使用Web服务器时,您可以依赖“主”目录。如果您想让脚本在Web和cli环境中工作,那么可以使用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

答案 10 :(得分:-6)

$ _ SERVER ['HOME']和getenv('home')对我不起作用。

但是,在PHP 5.5+上,这可以提供该文件所在的主目录:

explode( '/', __FILE__ )[2]

答案 11 :(得分:-10)

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

答案 12 :(得分:-13)

dirname(__DIR__);