Есть ли способ проверить, работает ли хост?
Я пытаюсь сделать это на 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
}