Каков наилучший метод проверки работоспособности сайта / сервера (PHP)

Я пытаюсь построить систему мониторинга работоспособности сайта / сервера в PHP, система должна будет проверять тысячи доменов / ips в минуту. Я посмотрел в CURL, так как это, кажется, лучший метод.

Редактировать: система будет обязана проверять сервер, проверять его время ответа и возвращать свой код ответа. Затем он добавит в базу данных mysql строку, содержащую время ответа и код состояния. Часть уведомлений системы довольно проста оттуда. Система будет на выделенных серверах. Надеюсь, что это добавляет ясности.

4 ответа

Решение

Почему бы не пойти на подход KISS и использовать функцию php get_headers()?

Если вы хотите получить код состояния, вот фрагмент из комментариев к странице руководства php:

function get_http_response_code($theURL) {
  $headers = get_headers($theURL);
  return substr($headers[0], 9, 3); 
}

Эта функция (будучи основной функцией php) должна быть быстрее и эффективнее, чем curl.

Для таких вещей есть очень хорошие инструменты. Не нужно писать это самостоятельно.

Посмотрите на Nagios, например. Многие администраторы используют его для мониторинга.

Если я правильно понимаю, ваша система будет постоянно подключаться к тысячам доменов /ips, и если она работает, предполагается, что сервер запущен и работает?

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

Вы также можете взглянуть на multi-cURL для многопоточных запросов (т.е. одновременно отправлять более 10 запросов cURL, а не по одному за раз).

http://php.net/manual/en/function.curl-multi-exec.php

Ваше узкое место будет в ожидании ответа данного хоста. Учитывая 30-секундный таймаут и N хостов для проверки, и все, кроме последнего хоста, не отвечают, вам нужно подождать 30(N-1) секунд, чтобы проверить последний хост. Вы никогда не сможете проверить последний хост.

Вам, безусловно, необходимо отправить несколько HTTP-запросов - либо multi-cURL, как уже предлагалось, либо класс HttpRequestPool для ОО-подхода.

Вам также нужно будет подумать о том, как разбить набор из N хостов, чтобы проверить максимальное количество подмножеств, чтобы избежать проблемы невозможности достичь хоста из-за необходимости сначала иметь дело с очередью не отвечающих хостов.

Проверка N хостов с 1 сервера дает наибольший шанс не достичь одного или нескольких хостов из-за очереди не отвечающих хостов. Это самый дешевый, самый простой и наименее надежный вариант.

Проверка 1 хоста на каждом из N серверов представляет наименьшую вероятность того, что один из них не достигнет одного или нескольких хостов из-за очереди не отвечающих хостов. Это самый дорогой, (возможно) самый сложный и самый надежный вариант.

Подумайте о соотношении цена / сложность / надежность, которое лучше всего подходит для вас.

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