Есть ли способ проверить, работает ли хост?

Я пытаюсь сделать это на PHP. Мне нужно проверить, если указанный хост "вверх"

Я думал о проверке связи с указанным хостом (хотя я не уверен, как бы я это сделал, так как для этого потребовался бы root. - Помогите здесь?)

Я тоже хоть пользуюсь fsockopen() попытаться подключиться к указанному порту, но это также не получится, если хост не будет прослушивать подключения к этому порту.

Кроме того, некоторые хосты блокируют запросы ping, так как я могу обойти это? Эта часть не является необходимостью, так что не беспокойтесь об этом слишком много. Я понимаю, что это может быть сложно.

4 ответа

Обычно я делаю простой cURL для общедоступной страницы и вижу, возвращает ли он 200. Если вы получаете 500, 404 или что-то еще, кроме ответа 200, вы знаете, что что-то подозрительное.

Короткий ответ: нет хорошего универсального способа сделать это. Ping примерно настолько близок, насколько это возможно (почти все хосты будут реагировать на это), но, как вы заметили, в PHP обычно требуется root-доступ, чтобы использовать низкий порт.

Позволяет ли ваш хост выполнять системные вызовы, чтобы вы могли выполнить команду ping на уровне операционной системы и затем проанализировать результаты? Это, вероятно, ваш лучший выбор.

$result = exec("ping -c 2 google.com");

Если хост блокирует запрос ping, вы можете сделать более общее сканирование портов для поиска других открытых портов (но это довольно грубо, не делайте этого с хостами, которые не дали вам определенного разрешения). Nmap - хороший инструмент для этого. Он использует немало хитростей, чтобы выяснить, работает ли хост и какие сервисы могут работать, а какие нет. Будьте осторожны, так как некоторые провайдеры виртуального хостинга прекратят действие вашей учетной записи за "хакерскую активность", если вы установите и используете Nmap, особенно в отношении хостов, которые вы не контролируете или не имеете разрешения на зондирование.

Кроме того, если вы находитесь на том же некоммутируемом уровне Ethernet, что и другой хост (например, если вы находитесь в той же открытой сети WiFi), адаптер Ethernet в случайном режиме может перехватывать трафик к хосту и обратно, даже если он это делает. не отвечать непосредственно вам.

Вы могли бы использовать CURL

$url = 'yoururl';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (200==$retcode) {
    // All's well
} else {
    // not so much
}

Чтобы хост вообще контролировался, должен быть открыт хотя бы один порт. Является ли хост веб-сервером? Если это так, вы можете просто открыть соединение с портом 80, если он успешно открыт, то хотя бы некоторая часть хоста работает.

Лучшим решением было бы иметь скрипт, доступный через Интернет только для вашего монитора, и тогда вы могли бы открыть соединение с ним, и этот скрипт вернул бы различные биты системной информации.

РЕДАКТИРОВАТЬ--

Насколько тщательным вы хотите, чтобы этот тест был? [сервер включен] -> [работает Apache] -> [веб-приложение работает] Все разные уровни работы. То, что apache возвращает что-то, по крайней мере показывает, что сервер включен, но не то, что ваше веб-приложение запущено. (Я понимаю, что у вас может не быть ничего подобного, но я надеюсь, что это полезный пример)

РЕДАКТИРОВАТЬ--

Стоит ли устанавливать облегченный http-сервер (я имею в виду очень легкий) только для мониторинга?

В противном случае вы могли бы установить что-то на хостах, которые звонили домой так часто, чтобы показать, что они работают?

Я использовал gethostbyname($hostname).

Функция дает вам IP-адрес, если хост включен, или входное имя хоста, если он не может найти IP.

if ($hostname !== gethostbyname($hostname)) {
    //Host is up
}

Другие вопросы по тегам