Принципы взаимодействия клиента и сервера в веб

Сервер приложений

Принципы взаимодействия клиента и сервера в веб

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}&current_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. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.

Веб‑разработка
Отправить
Поделиться
Запинить

Рекомендуем другие советы