192. * ....와 같은 컴퓨터의 로컬 IP를 얻어야합니다. PHP로 가능합니까?
스크립트를 실행하는 시스템의 IP 주소가 필요하지만 외부 IP는 필요하지 않으며 로컬 네트워크 카드 주소가 필요합니다.
답변:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
사이트 도메인 이름을 반환하지 않기 때문에 이것은 정확히 내가 원했던 것 입니다.
이것은 오래된 게시물이지만 다음과 같이 얻으십시오.
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
예를 들면 :
die( getLocalIp() );
다른 사이트에서 찾은 경우 trim 명령을 제거하지 마십시오. 그렇지 않으면 컴퓨터 이름을 얻게됩니다.
BACKTICKS (특수 따옴표) : PHP가 "특수 따옴표"(백틱) 사이에있는 모든 것을 쉘 명령으로 실행하고 결과 출력을 반환하기 때문에 작동합니다.
gethostbyname(trim(`hostname`));
다음을 수행하는 것과 매우 유사하지만 훨씬 더 효율적입니다.
$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS
gethostbyname
호스트 시스템에 대해 루프백 IP (예 : 127.0.0.1)를 반환하는 것이 가능하고 유효 합니다.
이것을 시도하십시오 (서버가 Linux 인 경우) :
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
적절한 인터페이스라는 보장은 없습니다 .
wlan0
대신에 지정 eth0
하고으로 대체 'inet addr:'
해야했습니다 'inet adr:'
. 아마도 시스템에서 사용되는 로케일 (fr_FR) 때문일 수 있습니다. 그 외에는이 답변이 제가 찾던 해결책이었습니다. 감사!
'inet adr:'
내 터미널 (프랑스어 로케일)에서 잘 작동했지만 PHP 스크립트 'inet addr:'
에서는 올바른 값이었습니다 (영어 로케일, 제 생각에).
로컬 컴퓨터의 기본 외부 IP 주소는 다음과 같이 얻을 수 있습니다.
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference
$localAddr = $name;
작동 원리 :
이것은 UDP이므로 socket_connect
네트워크로 나가지 않습니다. 소켓에 로컬 주소와 포트만 할당합니다. 이를 통해 로컬 주소를 얻을 수 있습니다.
이 솔루션은 네트워크 트래픽, DNS 또는 명령 실행없이 작동합니다.
경로가 없으면 작동하지 않을 수 있습니다 8.8.8.8
(예 : 인터넷에 연결되어 있지 않음).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
모듈이 PHP에 설치되고 활성화되어야한다는 점 을 언급하는 것이 중요합니다 .
지역의 의미에 따라 다릅니다.
로컬로 PHP 코드를 실행하는 서버 / 시스템의 주소를 의미하는 경우 여전히 논의 할 두 가지 방법이 있습니다. PHP가 웹 서버를 통해 실행되는 경우을 읽어 서버 주소를 얻을 수 있습니다 $_SERVER['SERVER_ADDR']
. PHP가 명령 줄 인터페이스를 통해 실행되는 경우 쉘을 실행 ipconfig
(Windows) / ifconfig
(* nix)하고 주소를 grep해야합니다.
로컬로 웹 사이트 방문자의 원격 주소를 의미하지만 외부 IP 주소가 아닌 경우 (구체적으로 192. *라고 말 했으므로) 운이 좋지 않은 것입니다. NAT 라우팅의 요점은 해당 주소를 숨기는 것입니다. IP 주소 뒤에있는 개별 컴퓨터의 로컬 주소를 식별 할 수는 없지만 동일한 IP에서 액세스하는 여러 컴퓨터가 있는지 구별하는 데 도움이되는 몇 가지 트릭 (사용자 에이전트, 아마도 Mac 주소)이 있습니다.
Linux 호스트의 CLI에서 일반 사용자로 이것을 시도 할 수 있습니다.
function get_local_ipv4() {
$out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
$local_addrs = array();
$ifname = 'unknown';
foreach($out as $str) {
$matches = array();
if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
$ifname = $matches[1];
if(strlen($matches[2])>0) {
$ifname .= $matches[2];
}
} elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
$local_addrs[$ifname] = $matches[1];
}
}
return $local_addrs;
}
$addrs = get_local_ipv4();
var_export($addrs);
산출:
array (
'eth0' => '192.168.1.1',
'eth0:0' => '192.168.2.1',
'lo' => '127.0.0.1',
'vboxnet0' => '192.168.56.1',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
알 겠어. 나는 PHP 파일에이 코드를 추가
split()
함수는 PHP 5.3.0부터 지원 중단되었습니다. 그래서 사용하는 것이 좋습니다 explode()
대신
쉬운 것입니다. 이 간단한 코드로 호스트 이름을 얻을 수 있습니다.
$ip = getHostByName(getHostName());
또는을 사용 $_SERVER['HTTP_HOST']
하여 호스트 이름을 가져올 수도 있습니다 .
$_SERVER['REMOTE_ADDR']
PHP_SELF
루트에 상대적인 경로로 현재 스크립트의 파일 이름을 반환합니다.
SERVER_PROTOCOL
페이지 요청 프로토콜의 이름과 개정판을 반환합니다.
REQUEST_METHOD
페이지에 액세스하는 데 사용되는 요청 방법을 반환합니다.
DOCUMENT_ROOT
현재 스크립트가 실행되고있는 루트 디렉터리를 반환합니다.