echo $ _SERVER ['REMOTE_ADDR']; показывает неопределенный [дубликат]

Они разные потоки и сбрасываются в разное время.

Если вы положили

  System.out.flush ();  System.err.flush ();   

внутри вашего цикла, он будет работать так, как ожидалось.

Чтобы уточнить, выходные потоки кэшируются, поэтому вся запись поступает в этот буфер памяти.

Вы пишете два буфера, затем после периода бездействия они оба покраснели (один за другим).

33
задан Matthew Scharley 5 March 2012 в 14:20
поделиться

5 ответов

Вы можете получить имя хоста, используя gethostname

40
ответ дан kabuko 16 August 2018 в 11:44
поделиться
  • 1
    Спасибо - это было здорово: Моим решением было: getHostByName (getHostName ()); – ChronoFish 29 November 2009 в 05:35
  • 2
    Это решение 5.3, но, к счастью, я выполняю 5.3 – ChronoFish 29 November 2009 в 05:36
  • 3
    В нижней части страницы есть комментарий в разделе & lt; 5.3. – user 30 November 2009 в 05:08
  • 4
    слово предостережения: этот метод (и gethostbynamel()) всегда будет возвращать любые IP-адреса, отображаемые в файле локальных хостов вашего сервера. В моем тестировании (Ubuntu 11.10) это означало, что если имя хоста, с которым вы проверяете, сопоставляется с 127.0.0.1 в любом месте в / etc / hosts, оно переопределит любые другие записи. – pospi 27 March 2012 в 08:28

попробуйте это, он должен вернуть ip-адрес сервера

$host= gethostname();
$ip = gethostbyname($host);
28
ответ дан Anish 16 August 2018 в 11:44
поделиться
  • 1
    SHOW 192.168.1.1 :) – user956584 24 March 2012 в 18:31
  • 2
    Работает! Спасибо! – Oniz 9 August 2013 в 10:41
  • 3
    Это не работает для меня: 127.0.1.1 ... – Besnik 19 September 2013 в 11:08
  • 4
    @Besnik, если вы используете версию php & lt; 5.3.0, но & gt; = 4.2.0 использовать это: $ hostname = php_uname ('n') ;. Выше будет работать для версии php & gt; 5.3.0 – Anish 20 September 2013 в 13:47
  • 5
    @aneesh +1 отлично! php -r "echo gethostbyname(php_uname('n'));" показывает 192.168.178.20 ... и я использую php 5.3.8 – Besnik 21 September 2013 в 19:30

Если все остальное не работает, вы всегда можете exec ipconfig или ifconfig в зависимости от вашей платформы и проанализировать результат.

3
ответ дан antik 16 August 2018 в 11:44
поделиться
  • 1
    Если бы я не работал 5.3, я бы отказался от решения на уровне ОС, как это. Благодаря! – ChronoFish 29 November 2009 в 05:39
  • 2
    не уверен, насколько он надежный, но вы можете пропустить exec () и использовать php_uname ('n'), чтобы вытащить имя хоста для перехода к getHostByName () – joshtronic 31 March 2011 в 02:45

Я знаю, что это довольно старый вопрос, но, похоже, не существует окончательного ответа (насколько это возможно). Мне нужно было определить это значение как на * NIX-боксах, так и на на коробках Win X. Также из сценария выполненного CLI, а также скрипта, отличного от CLI. Следующей функцией является лучшее, что я придумал, которое заимствует разные концепции, о которых люди говорили за эти годы. Возможно, это может быть полезно:

function getServerAddress() {
    if(isset($_SERVER["SERVER_ADDR"]))
    return $_SERVER["SERVER_ADDR"];
    else {
    // Running CLI
    if(stristr(PHP_OS, 'WIN')) {
        //  Rather hacky way to handle windows servers
        exec('ipconfig /all', $catch);
        foreach($catch as $line) {
        if(eregi('IP Address', $line)) {
            // Have seen exec return "multi-line" content, so another hack.
            if(count($lineCount = split(':', $line)) == 1) {
            list($t, $ip) = split(':', $line);
            $ip = trim($ip);
            } else {
            $parts = explode('IP Address', $line);
            $parts = explode('Subnet Mask', $parts[1]);
            $parts = explode(': ', $parts[0]);
            $ip = trim($parts[1]);
            }
            if(ip2long($ip > 0)) {
            echo 'IP is '.$ip."\n";
            return $ip;
            } else
            ; // TODO: Handle this failure condition.
        }
        }
    } else {
        $ifconfig = shell_exec('/sbin/ifconfig eth0');
        preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
        return $match[1];
    }
    }
}
8
ответ дан ImpressTheNet Web Developer 16 August 2018 в 11:44
поделиться

Если вы работаете с PHP & lt; 5.3, это может помочь (в системах на основе NIX по крайней мере):

 mscharley@S04:~$ cat test.php
#!/usr/bin/env php
<?php

function getIPs($withV6 = true) {
    preg_match_all('/inet'.($withV6 ? '6?' : '').' addr: ?([^ ]+)/', `ifconfig`, $ips);
    return $ips[1];
}

$ips = getIPs();
var_dump($ips);

 mscharley@S04:~$ ./test.php
array(5) {
  [0]=>
  string(13) "72.67.113.141"
  [1]=>
  string(27) "fe80::21c:c0ff:fe4a:d09d/64"
  [2]=>
  string(13) "72.67.113.140"
  [3]=>
  string(9) "127.0.0.1"
  [4]=>
  string(7) "::1/128"
}
 mscharley@S04:~$

Или, если вы не ожидаете часто делать это, возможно, это сработает (просто не злоупотребляйте им):

$ip = file_get_contents('http://whatismyip.org/');
14
ответ дан Matthew Scharley 16 August 2018 в 11:44
поделиться
  • 1
    Спасибо. Мне нравится ваше решение Linux / Unix, но для этого приложения я запускаю Windows ... (Да, я знаю ... PHP CLI на Windows ?!). Вебсервис с удовольствием узнает об этом - я должен буду иметь в виду, когда мне нужно «за пределами IP-адреса брандмауэра». :). – ChronoFish 29 November 2009 в 05:44
Другие вопросы по тегам:

Похожие вопросы: