Принципы взаимодействия клиента и сервера в веб
Сервер приложений и сервер баз данных
Сервер приложений
Принципы взаимодействия клиента и сервера в веб
Сервер приложений и сервер баз данных
index.html — это статичный файл, всегда одинаковый. Чтобы страница показывала разное, динамическое содержимое — например курс валют, прогноз погоды или корзину в интернет‑магазине — используют серверные языки программирования: PHP, Node.js, Python, Ruby и другие.
На сервер устанавливают сервер приложений — ещё одну программу или расширение к веб‑серверу. Его задача — выполнить наш код на сервере и отдать результат выполнения веб‑серверу. Скажем, если на сервере установлен веб‑сервер Apache, то после установки mod_php вместо статического index.html можно использовать динамический index.php:
<?php
$epithets = ['замечательный', 'удивительный', 'самый милый на свете', 'невероятно красивый', 'ласковый и нежный'];
$currentEpithet = $epithets[array_rand($epithets)]; // Выбираем случайный эпитет из набора выше
$currentYear = date('Y'); // Получаем текущий год
// Печатаем, то есть выдаём назад, результат в виде ХТМЛ-кода нашей страницы:
print "<!doctype html>
<html lang='ru'>
<head>
<meta charset='UTF-8'>
<title>Мой кот</title>
</head>
<body>
<h1>Мой {$currentEpithet} кот</h1>
<img src='cat.jpg'>
<footer>© {$currentYear}</footer>
</body>
</html>";
Сервер приложений прочитает index.php, выполнит его как программу и выдаст результат в виде текста — всё того же ХТМЛ‑кода веб‑страницы. Но разница в том, что этот текст не хранится в общем для всех файле в папке, а готовится специально для каждого пользователя со своим конкретным запросом. Получившийся ХТМЛ сервер‑приложений отдаст веб‑серверу, чтобы тот переслал его браузеру.
С помощью сервера приложений веб‑сервер может показывать разное содержимое разным клиентам по одному и тому же адресу веб‑страницы. Скажем, вот такой код определяет город клиента и показывает погоду в нём:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$ipDetails = json_decode(file_get_contents("https://ipinfo.io/{$ip}")); // Получаем информацию об айпи-адресе клиента с веб-сервера на ipinfo.io
list($latitude, $longitude) = explode(',', $ipDetails->loc); // Разбираем координаты на широту и долготу
$weatherData = json_decode(file_get_contents("https://api.open-meteo.com/v1/forecast?latitude={$latitude}&longitude={$longitude}¤t_weather=true")); // Получаем погоду для координат
$currentWeather = $weatherData->current_weather; // Находим текущую погоду
$currentTemperature = round(abs($currentWeather->temperature)); // И форматируем температуру, округляя и добавляя правильный знак перед числом
$currentTemperature = $currentWeather->temperature > 0 ? "+{$currentTemperature}" : "−{$currentTemperature}";
print "<!doctype html>
<html lang='ru'>
<head>
<meta charset='UTF-8'>
<title>Температура за окном</title>
</head>
<body>
<h1>За окном {$currentTemperature}°</h1>
</body>
</html>";
Если сервер приложений — это расширение веб‑сервера, то веб‑сервер самостоятельно запускает код из нужного файла, получает ХТМЛ и передаёт его обратно клиенту.
Если сервер приложений запущен отдельной программой, то настраивают проксирование — веб‑сервер передаёт запрос браузера серверу приложений, дожидается его ответа и передаёт его обратно клиенту. Сервер приложений при этом работает точно так же, как веб‑сервер — занимает отдельный порт, принимает запросы и отвечает на них.
Конечно, в конфигурации с отдельным сервером приложений можно было бы избавиться от веб‑сервера, поставить на его место сервер приложений и обращаться к нему напрямую, но это не очень эффективно. Сервера приложений оптимизированы для выполнения кода, в них нет фич, необходимых обычному веб‑серверу: быстрой отправки файлов, обработки медленных клиентов, проксирования, кэширования и многих других.
Сервер баз данных
Чтобы отобрать товары в наличии на сезон весна‑лето и показать их с ценой, рейтингом и оценками, не обойтись без ещё одной программы — сервера базы данных. Это продвинутый цифровой органайзер информации, как Гугль‑таблицы или Эксель, но мощнее. Базы данных хранят огромные объёмы данных, например, покупателей, товары и продажи, и их связи друг с другом — оценки покупателей, комментарии и остатки на складе. А сервер базы данных обеспечивает высокую скорость обращения к информации, изменение данных, их сохранность и целостность при массовых запросах разных пользователей.
К серверу базы данных можно обращаться из кода, выполняемого сервером приложений. Сервер приложений отправит запрос на изменение или получение данных, а сервер базы данных обратится к своему хранилищу, внесёт изменения или найдёт нужное и вернёт результат. Например, так можно найти топ‑5 мужских худи на весну с рейтингом более 4,7:
<?php
$host = 'localhost'; // Параметры подключения к базе данных
$dbname = 'store';
$username = 'root';
$password = '';
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); // Подключаемся к базе данных
// Формулируем запрос на получение нужных товаров, используя SQL — язык запросов к базе данных
$sql = "SELECT name, price, rating
FROM products
WHERE category = 'hoodie'
AND gender = 'male'
AND season = 'spring'
AND rating > 4.7
ORDER BY rating DESC
LIMIT 5";
$stmt = $pdo->query($sql); // Выполняем запрос
$hoodies = $stmt->fetchAll(PDO::FETCH_ASSOC); // Получаем результат
print "<!doctype html>
<html lang='ru'>
<head>
<meta charset='UTF-8'>
<title>Лучшие мужские худи сезона</title>
</head>
<body>
<h1>Лучшие мужские худи сезона</h1>
<ul>";
foreach ($hoodies as $hoodie) {
print "<li>{$hoodie['name']} — {$hoodie['price']} рублей, ★ {$hoodie['rating']}</li>";
}
print "</ul>
</body>
</html>";
Самая простая и распространённая база данных — это SQLite. Это локальная база данных, которая хранит всё в одном файле и недоступна по сети. Базы данных посерьёзнее — это Oracle, PostgreSQL, MySQL, MongoDB и прочие.
Теперь браузер обращается к веб‑серверу, тот идёт к серверу приложений. Сервер приложений выполняет код, который подключается к серверу базы данных, вытаскивает из неё всё, что нужно для страницы, генерирует ХТМЛ и отдаёт его веб‑серверу, чтобы он переслал его браузеру.
P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.