fsockopen() всегда возвращает true

Привет, я пытаюсь включить в свой проект функцию, которая будет пинговать мои серверы приложений и смотреть, работают ли они или нет. Проблема в том, что каждый раз, когда я пытаюсь использовать эту функцию, она всегда возвращает, что они живы, даже если я нахожусь в своей локальной среде, и на этих IP-адресах нет серверов. Так что же происходит?

Вот моя функция:

function ping($host, $port, $timeout) { 
    if($fp = fsockopen($host,$port,$errCode,$errStr,$timeout)){   
       return 'Alive';
    } else {
       return 'Not alive'; 
    } 
    fclose($fp);
}

Вот как я вызываю функцию:

    foreach ($appservers as $key => $value) {
        echo ping($value['privateip'] , 80, 1).'<br/>';
    }

Вот мой массив серверных переменных:

$appservers = array(
'app1' => array(
    'publicdns' => 'app1.xxxx.com',
    'privateip' => '1.1.1.101',
    'alive' => NULL,
    'active_users' => NULL
),

'app2' => array(
    'publicdns' => 'app2.xxxx.com',
    'privateip' => '1.1.1.102',
    'alive' => NULL,
    'active_users' => NULL
),

'app3' => array(
    'publicdns' => 'app3.xxxx.com',
    'privateip' => '1.1.1.103',
    'alive' => NULL,
    'active_users' => NULL
),

'app4' => array(
    'publicdns' => 'app4.xxxx.com',
    'privateip' => '1.1.1.104',
    'alive' => NULL,
    'active_users' => NULL
)

);


person slick1537    schedule 08.05.2013    source источник


Ответы (1)


Сталкивались с этой проблемой раньше. Вы используете службу DNS, которая разрешает несуществующие домены серверу, который предоставляет вам «дружественную» страницу с ошибкой, которую он возвращает с кодом ответа 200.

Подробнее об этой проблеме см. в разделе get_headers Inconsistency.

Вы можете решить эту проблему с помощью решения DavidRandom.

var_dump(ping("stackoverflow.com", 30, 1)); // port 30 return false
var_dump(ping("stackoverflow.com", 80, 1)); // port 80; returns 0.49000000953674

Ваша функция изменена

function ping($host, $port, $timeout) {
    $a = gethostbyname('idontexist.tld');
    $b = gethostbyname($host);

    if ($a == $b)
        return false;

    $time = microtime(true);
    $fp = @fsockopen($host, $port, $errCode, $errStr, $timeout);
    $time = microtime(true) - $time;
    if ($fp) {
        fclose($fp);
        return $time;
    } else {
        return false;
    }
}
person Baba    schedule 08.05.2013
comment
круто спасибо за обновление. Просто интересно, что делает знак @ перед fsockopen? - person slick1537; 08.05.2013
comment
Плохая новость: я только что попробовал обновленный код, и он возвращает время пинга....0.010555028915405 0.010455846786499 0.010455846786499 0.0095298290252686 - person slick1537; 08.05.2013
comment
@KevinMcKinney подавление ошибок .... Если вы можете дать 2 из этих IP-адресов, я хотел бы проверить себя - person Baba; 08.05.2013
comment
IP-адреса, которые я использую, перечислены в массиве $appservers. 1.1.1.101, 1.1.1.102, 1.1.1.103 и 1.1.1.104 - person slick1537; 08.05.2013
comment
В конце концов, я могу просто «пропинговать» его на другом порту, который обычно был бы открыт, если бы серверное приложение работало, что я действительно проверяю в любом случае. - person slick1537; 10.05.2013