Я пытаюсь создать веб-сайт мониторинга webapp с PHP. URL-адреса сайтов для мониторинга хранятся в таблице MySQL. Скрипт запускается каждую минуту через cron - он проходит через все веб-сайты и URL-адрес foreach, он использует CURL для посещения сайта и CURLINFO_HTTP_CODE, чтобы получить код HTTP - он возвращает true, если сайт вверх и false, если нет.PHP-скрипт с циклом Foreach, работающий с cron - занимает слишком много времени - как это сделать быстрее
Сценарий работает нормально - с одним или двумя веб-сайтами он запускает миллисекунды, но с 20 сайтами он занимает в среднем 2-15 секунд для запуска. Я вижу, что это вызовет проблемы при добавлении большего количества сайтов - в идеале мне нужно отслеживать тысячи сайтов и пользователей, чтобы они могли добавлять свои собственные сайты.
Я подумал о том, что отдельные клоны и файлы добавляются для каждого URL-адреса, когда пользователь добавляет сайт для мониторинга - однако я не уверен, как это сделать, и я могу предвидеть некоторые проблемы, поскольку я работаю над общим сервер.
Так как же я должен идти об этом или есть лучший способ, о котором я не думал?
<?php
function visit($url) {
// VISITS WEBSITE - RETURNS TRUE IF SITE UP, FALSE IF DOWN
}
// GETS THE MONITOR DETAILS FROM DATABASE
$monitor = new Table($monitorInstance);
$all_monitors = $monitor->get('monitors');
$monitors = $monitor->tableData();
//LOOP THROUGH ALL MONITORS
foreach ($monitors as $monitor1) {
$id = $monitor1->id; //GETS ID
$website = $monitor1->url; //GETS URL
$status = $monitor1->status; //GETS STATUS - 'up' or 'down'
// RUNS FUNCTION
if (visit($website)) {
$new_status = 'up';
} else {
$new_status = 'down';
}
// IF STATUS CHANGE UPDATE THE DATABASE
if ($new_status != $status) {
try {
//update the database with the new status
$monitor->update('monitors', $id, array(
'status' => $new_status,
));
} catch(Exception $e) { //catch exceptions
die($e->getMessage());
}
// ALSO SEND EMAIL TO USER
}
}
'он использует CURL для посещения сайта и получения HTTP-кода - он возвращает true, если веб-сайт вставлен и false, если нет', почему бы не скрутить только заголовок и проверить код http-status вместо того, чтобы получать полный контент страница? – JustOnUnderMillions
И почему бы не «обновить» 'мониторы' со всеми новыми значениями одновременно, а не делать несколько запросов sql? – JustOnUnderMillions
Почему вы не смотрите на несколько завиток, где вы можете делать запросы одновременно – frz3993