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에서 사용할 수 없습니다.대신 변수는 다음과 같이 분할됩니다.$_SERVER['HOMEDRIVE']
그리고.$_SERVER['HOMEPATH']
.
환경에서 $HOME 값을 가져올 수 있습니다.
<?php
$home = getenv("HOME");
?>
PHP를 사용하면 OS 사용자의 홈 디렉토리를 가져올 수 있습니다.두 가지 방법이 있습니다.
방법 #1:
우선 OS 사용자 ID를 파악하여 어딘가에 저장해야 합니다(예: 데이터베이스 또는 구성 파일).
// Obviously this gotta be ran by the user which the home dir
// folder is needed.
$uid = posix_getuid();
이 코드 비트는 이전에 수집한 올바른 대상 사용자 ID만 전달하면 모든 OS 사용자, 심지어 일반 웹 서버 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 대신 대상 OS 사용자 이름을 전달해야 합니다.
$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);
/**
* 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;
}
어떤 이유로든getenv('HOME')
서버 OS가 작동하지 않거나 서버 OS가 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
서버가 아닌 스크립트에 대해서는 완전히 신뢰할 수 없지만$_ENV['HOME']
표준 셸 스크립트에 더 적합할 수 있습니다.언제든지 가능합니다.print_r( $GLOBALS )
사용자 환경에서 사용할 수 있는 기능을 확인할 수 있습니다.phpinfo()
또한 CLI 스크립트에서 호출할 때 텍스트를 뱉으며, 좋은 역할만 합니다.php -i
셸에서 실행하면 동일한 작업을 수행할 수 있습니다.
이것은 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;
}
최근 프로젝트에서 사용한 방법은 다음과 같습니다.
exec('echo $HOME')
다음을 수행하여 개체에 저장했습니다.
$this->write_Path = exec('echo $HOME');
하지만 원하는 방식으로 저장하고 적합한 방식으로 사용할 수 있습니다.
웹 서버로 작업할 때 "홈" 디렉토리를 사용할 수 있습니다.CLI를 사용하면 웹 및 CLI 환경에서 스크립트를 작동하려면 사용자 경로(윈도우)를 제공합니다. 루트(홈) 디렉토리까지 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
이것이 오래된 질문이라는 것은 알지만, 응용프로그램 전반에 걸쳐 복제하기 쉬운 대체 방법을 찾고 있다면 Composer를 통해 설치된 라이브러리를 사용하는 것을 고려해 볼 수 있습니다.여기에 해답의 일부를 모아 도서관으로 만든 도서관을 썼는데 뻔뻔스럽게도 여기에 홍보하겠습니다: juliardi/homemedir.
Composer를 통해 설치할 수 있습니다.
$ composer require juliardi/homedir
그런 다음 응용 프로그램에서 사용합니다.
<?php
require_once('vendor/autoload.php');
$userHomeDir = get_home_directory();
이 답변이 도움이 되길 바랍니다.
$_SERVER['HOME'] 및 getenv('home')가 나에게 맞지 않았습니다.
그러나 PHP 5.5+에서는 파일이 위치한 홈 디렉토리를 제공합니다.
explode( '/', __FILE__ )[2]
ㅠㅠ$_SERVER['DOCUMENT_ROOT']
홈 디렉토리로 사용할 수 있습니다.
dirname(__DIR__);
언급URL : https://stackoverflow.com/questions/1894917/how-to-get-the-home-directory-from-a-php-cli-script
'programing' 카테고리의 다른 글
Xcode - 테스트 호스트를 찾을 수 없습니다. (0) | 2023.08.28 |
---|---|
각 루프에 대한 다음 요소 가져오기 (0) | 2023.08.28 |
AJAX 오류가 있는 서버 응답을 받으시겠습니까? (0) | 2023.08.28 |
Matplotlib 그림 얼굴색(배경색) (0) | 2023.08.28 |
MySQL이 캐시하는 쿼리를 MariaDB가 캐시하지 않습니까? (0) | 2023.08.28 |