Решение проблем с веб-приложениями на C — самом экологичном языке программирования

Решение проблем с веб-приложениями на C — самом экологичном языке программирования

12 ноября 2022 г.

Язык C и Интернет

Несмотря на то, что большая часть мировой веб-инфраструктуры написана на C, большинство людей не думают о C для написания веб-приложений. И это понятно, учитывая отсутствие в C простых в использовании веб-конструкций и конструкций баз данных, прямого подключения к веб-серверам и проблем с безопасностью, и это лишь некоторые из них.

C, однако, является самым экологичным языком программирования, и это важно, если мы хотите помочь окружающей среде. Если вам нужна наилучшая производительность, конечно, не помешает использовать C.

В этой статье показано, как использовать мощь C и решить вышеупомянутые проблемы.

Что такое Вели?

Vely — это универсальная платформа для разработчиков C. Приложения, созданные с помощью Vely, являются нативными, без интерпретаторов или схем байт-кода.

Приложение, которое вы напишете и запустите

Вы напишете веб-приложение для отдела кадров, в котором хранится список сотрудников. Это просто и не совсем изобилует прибамбасами, но демонстрирует достаточно, чтобы начать. И вы бы не хотели, чтобы учебник, предназначенный для обучения, был загроможден всевозможными вещами, которые вы можете легко добавить самостоятельно. Цель здесь — изучить основы.

Итак, для этого есть три части.

  • Первый — добавление сотрудников.
  • Второй показывает список сотрудников.
  • Третья возможность удалить сотрудника из списка.

Прежде чем начать:

  1. Установите Vely. Вы можете использовать стандартные упаковщики, такие как apt, dnf, zypper или pacman. Перейдите на https://vely.dev/pkg/, чтобы установить Vely. Вы всегда можете удалить его с помощью того же упаковщика,
  2. Создайте каталог для своего проекта. Вы можете назвать его как угодно. Все, что здесь делается, должно быть сделано в этом каталоге,
  3. Убедитесь, что у вас установлены MariaDB и Nginx, так как здесь они используются.

Скриншоты приложения

Вот снимки приложения. Это конечный результат.

Веб-форма для добавления сотрудника:

Результат добавления сотрудника:

Список сотрудников:

Вы также можете удалить сотрудника, и после этого его больше не будет в списке.

Вели - как это работает

Далее вы создадите файлы исходного кода для приложения. Файлы имеют расширение .vely.

Исходный код в этих файлах написан на C с инструкциями Vely. Каждый оператор будет генерировать определенный код C, поэтому конечным результатом всегда будет C. Так работает Vely.

Частью, которая делает Vely фреймворком, является обработка запросов — простой диспетчер обеспечивает основу для стандартной обработки HTTP-запросов по всем направлениям. Существует также автоматический сборщик мусора в памяти, который полезен для длительных процессов, таких как демоны веб-приложений.

Суть в том, что код Vely превратится в чистый C, который затем скомпилируется в собственное приложение.

Введение в использование SQL

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

В настоящее время Vely поддерживает базы данных MariaDB/mySQL, PostgreSQL и SQLite. Интерфейс одинаков для любого из них. Например, чтобы запросить таблицу employee и отобразить список найденных имен, используйте код Vely:

run-query @db = 
    "select firstName, lastName from employee where employeeID='%s'" 
    output firstName, lastName 
    : empid

    @Employee is <<query-result  firstName>> <<query-result  lastName>>
end-query

Вот несколько вещей, о которых следует помнить при кодировании Vely:

* Продолжение строки

Обратите внимание на использование обратной косой черты (), которая, как и в C, означает продолжение строки. Таким образом, первые 3 строки кода представляют собой один оператор.

* Вывод данных

Чтобы отобразить данные для веб-клиента (например, браузера) или стандартного вывода, используйте оператор вывода, который представляет собой @ в начале строки.

* Конфигурация базы данных

База данных указывается с помощью предложения @, в данном случае это @db. Это файл, содержащий информацию о подключении к собственной базе данных. Каждая база данных имеет свою собственную; в этом случае вы используете MariaDB (или mySQL), поэтому файл db может иметь следующее содержимое:

[client]  
user=user_name 
password=password     
database=database_name     
socket=/run/mysqld/mysqld.sock

Вы можете прочитать больше об детали написания информации о строке подключения. для MariaDB/mySQL. Vely использует собственное подключение к базе данных для повышения производительности, и детали подключения также являются собственными. Это охватывает большую часть того, что вам нужно для запроса базы данных на C с помощью Vely.

* Запросы к базе данных

Чтобы выполнить запрос, используйте оператор run-query. Обычно в нем указывается используемая база данных (с предложением @), сам запрос и список выходных столбцов (с предложением output). Вы предоставляете входные параметры для оператора SQL после предложения :.

* Результаты запроса

Чтобы отобразить данные столбца из набора результатов запроса, используйте оператор query-result. При использовании в выводе, как в данном случае, вы можете поместить его в << и >> — это встроенный код.

* Циклы запросов

Если вы хотите просмотреть набор результатов вашего запроса в цикле, отметьте конец этого цикла оператором end-query, как указано выше.

Шаг 1. Начало работы — база данных

Сначала вы создадите базу данных и таблицу сотрудников, используемые здесь. SQL в этом примере прост, поэтому вы можете использовать любого поставщика базы данных. Однако здесь используется MariaDB. SQL для создания таблицы сотрудников выглядит следующим образом. Сохраните это в файле setup.sql:

create table if not exists employee (
    firstName varchar(50),
    lastName varchar(50),
    employeeID integer primary key auto_increment);

Войдите в утилиту mySQL как пользователь root (администратор базы данных) и выполните это, чтобы создать базу данных, таблицу пользователей и сотрудников:

create database if not exists emp;
create user if not exists appuser identified by 'my_password';
grant create,alter,drop,select,insert,delete,update 
    on emp.* to appuser;
use emp;
source setup.sql;
exit

Наконец, Vely нужно знать, где находится ваша база данных. Создайте файл конфигурации базы данных db (это имя используется в операторах запроса на выполнение). Скопируйте это в файл db:

[client]
user=appuser
password=my_password
database=emp
protocol=TCP
host=127.0.0.1
port=3306

Обратите внимание, что базы данных appuser и emp (а также пароль) такие же, как и в SQL-запросе создания, который вы выполнили в утилите mysql.

Шаг 2. Исходный код

Вот исходный код. Скопируйте и вставьте код в файлы в соответствии с инструкциями.

Список сотрудников (запрос к таблице)

Это отобразит список сотрудников из таблицы сотрудников. Просто чтобы проиллюстрировать использование любого кода C (поскольку большая часть кода здесь — операторы Vely), я добавил код C, чтобы узнать идентификатор процесса (PID) и отобразить его. Сохраните это в файл emp.vely:

#include "vely.h"

void emp()
{
    out-header default

    @<!DOCTYPE html>
    @<html>
    @<head><title>Vely example</title></head>
    @<body>

    pid_t pid = getpid(); // get current process ID

    @Employee report from process <<pf-out "%d", pid>>
    @<hr/>

    @<table border="1">

    run-query @db = 
        "select firstName, lastName, employeeID from employee" 
        output firstName, lastName, employeeID

        @<tr>
            @<td> <<query-result lastName>> </td>
            @<td> <<query-result firstName>> </td>
            @<td> 
                <a href="?req=del_emp
                    &employee_id=<<query-result employeeID>>">
                    Delete
                </a> </td>
        @</tr>
    end-query
    @</table>
    @</body>
    @</html>
 }

Как видите, оператор вывода @ используется очень часто. Он выводит любой текст, который следует на той же строке. Поскольку одна и та же программа Vely может служить как веб-приложением, так и программой командной строки, назначение выходных данных зависит от того, как вы ее используете. Если это веб-приложение, вывод идет к веб-клиенту, то есть к браузеру. Если это программа командной строки, вывод идет на стандартный вывод, т. е. stdout.

При выводе данных встроенный код часто используется как часть вывода. Встроенный код пишется между << и >> и обычно вызывает оператор Vely, который что-то выводит. В этом примере query-result выводит значения столбца набора результатов запроса.

Обратите внимание, что у вас будет возможность удалить запись о сотруднике, щелкнув ссылку Удалить. Ссылка вызывает обратно ваше приложение и указывает, запись какого сотрудника следует удалить на основе employeeID, встроенного в ссылку для удаления.

Все запросы Vely должны иметь входной параметр req, указывающий, какой файл .vely будет обрабатывать запрос. Таким образом, когда пользователь щелкает ссылку, запускается код в del_emp.vely. Это скоро.

Добавить сотрудника (вставить в таблицу)

Для вставки данных в таблицу сотрудников в качестве входных параметров будут указаны имя и фамилия сотрудника. Их легко получить в инфраструктуре Vely с помощью операторов input-param. Затем INSERT SQL вставит данные с помощью run-query, в котором используется предложение no-loop, чтобы сказать, что цикла набора результатов нет (т. е. это не SELECT). query) и affected-rows, чтобы получить количество фактически вставленных строк. Наконец, вы проверите, была ли строка вставлена ​​должным образом, и сообщите об этом пользователю. Сохраните этот код в файл add_emp.vely:

#include "vely.h"

void add_emp() {
    out-header default

    input-param first_name
    input-param last_name

    run-query @db = 
        "insert into employee (firstName, lastName) 
            values ('%s', '%s')" 
        : first_name, last_name 
        no-loop 
        affected-rows define aff_rows

    if (aff_rows != 1) {
        @Could not add employee!
        exit-request
    }

    @Employee added
}

Веб-форма для добавления сотрудников

Чтобы добавить сотрудников, вам понадобится веб-форма для их ввода перед отправкой в ​​качестве входных параметров в add_emp.vely для обработки. Вот простая форма для этого — обратите внимание на использование "?" в качестве атрибута действия в элементе

. Это означает: используйте тот же URL-адрес, который привел сюда, а затем добавьте строку запроса URL-адреса из полей ввода формы.

Обратите внимание на скрытое поле req, которое является обязательным полем, которое необходимо Vely для маршрутизации HTTP-запросов — неудивительно, что оно содержит add_emp. Сохраните это в файле form_add_emp.vely:

#include "vely.h"

void form_add_emp() {
    out-header default

    @<h2>Enter employee</h2>

    @<form action="?" method="POST">
    @    <input type="hidden" name="req" value="add_emp">

    @    <label for="first_name">First name:</label><br>
    @    <input type="text" name="first_name" value=""><br>

    @    <label for="last_name">Last name:</label><br>
    @    <input type="text" name="last_name" value=""><br><br>

    @    <input type="submit" value="Submit">
    @ </form>
}

Удалить сотрудника (удалить из таблицы)

При удалении записи о сотруднике будет получен идентификатор сотрудника и выполнен оператор SQL DELETE. Обратите внимание на использование предложения :, которое позволяет указать входные параметры SQL, в данном случае employee_id для удаления. Сохраните это в файл del_emp.vely:

#include "vely.h"

void del_emp() {
    out-header default

    input-param employee_id

    run-query @db = 
        "delete from employee where employeeID='%s'" : employee_id 
        no-loop 
        affected-rows define aff_rows

    if (aff_rows == 1) {
        @Employee record deleted.
    } else {
        @Could not delete an employee record.
    }
}

Шаг 3. Создайте приложение

Чтобы создать приложение Vely, сделайте следующее:

sudo vf -i -u $(whoami) emp

-i говорит создать приложение Vely, -u говорит, что его владельцем будет текущий пользователь, а emp это приложение имя.

Это создаст каталог /var/lib/vv/emp, который является каталогом приложения для вашего проекта (см. как Вели работает). Вы инициализировали его и настроили разрешения, позволяющие текущему пользователю использовать этот каталог, в то время как другие пользователи не могут получить к нему доступ.

Шаг 4. Подать заявку

Теперь в вашем проекте есть следующие файлы: emp.vely, form_add_emp.vely, add_emp.vely, del_emp .vely и db. Vely' утилита vv создаст из них приложение - она ​​автоматически найдет эти файлы и сгенерирует для вас правильный Makefile и свяжет необходимые библиотеки.

Вы можете сделать приложение с помощью vv:

vv -q --db=mariadb:db

-q говорит, что вы делаете приложение. --db говорит, что вы используете базу данных MariaDB, а файл конфигурации базы данных находится в файле db.

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

Шаг 5. Запустите приложение

Вы будете запускать приложение как сервер приложений FastCGI. Ваш сервер приложений работает за веб-сервером (в данном случае Nginx), который действует как обратный прокси-сервер. Несколько постоянных и параллельных серверных процессов будут обслуживать входящие запросы. Процессы не выходят и работают параллельно. Кроме того, они недоступны для конечного пользователя напрямую.

Чтобы запустить приложение:

vf -w 5 emp

Это запустит 5 одновременных процессов. Прочтите vf — менеджер процессов Vely FastCGI, чтобы узнать, как можно точно настроить производительность, включая настройку динамического загрузчика процессов, который изменяется количество запущенных процессов, основанное на фактической нагрузке во время выполнения.

Шаг 6. Настройте Nginx для FastCGI

Последний шаг — настроить веб-сервер, в данном случае Nginx. Отредактируйте файл конфигурации Nginx — для Ubuntu и аналогичных дистрибутивов Linux:

sudo vi /etc/nginx/sites-enabled/default

и для Fedora, например RedHat:

sudo vi /etc/nginx/nginx.conf

Добавьте следующее в раздел "сервер {}":

location /emp { include /etc/nginx/fastcgi_params; fastcgi_pass unix:///var/lib/vv/emp/sock/sock; }

Перезапустите Nginx, чтобы изменения вступили в силу:

sudo systemctl restart nginx

Здесь вы подключили URL-путь «/emp» к сверхбыстрому сокетному соединению Unix между Nginx и вашими серверами приложений. Таким образом, URL-адрес вида:

http://<your web server>/emp?req=add_emp&first_name=Joe&last_name=Darling

будет вызывать функцию add_emp() в файле add_emp.vely с именем и фамилией в качестве входных параметров.

Вот и все

Теперь у вас есть функциональное приложение, готовое к использованию. Ниже описаны различные способы его использования.

Использование приложения из веб-браузера

Следующие URL-адреса представляют собой интерфейс к вашему приложению. Используйте оба, чтобы запустить его. Первый — добавить сотрудника:

http://<your web server>/emp?req=form_add_emp

Это список сотрудников

http://<your web server>/emp?req=emp

Конечно, замените «" либо адресом обратной связи "127.0.0.1" (если вы тестируете локально), либо полным именем или IP-адресом вашего веб-сервера.

Обратите внимание на следующие факты:

  1. URL-путь — это имя вашего приложения — в данном случае /emp, поскольку именно так вы настраиваете его с помощью Nginx,
  2. параметр req всегда представляет собой базовое имя исходного файла запроса, который его обрабатывает. Например, req=form_add_emp означает, что код в form_add_emp.vely будет обрабатывать запрос,
  3. любые другие параметры, которые вы можете выбрать по своему усмотрению.

Обратите внимание, что если у вас нет веб-сервера, но вы все равно хотите использовать свой сервер приложений, вы можете связаться с ним напрямую в командной строке с помощью клиента FastCGI, включенного в установку Vely (таким образом, в обход веб-сервера). В этом случае вы должны попросить сервер приложений вывести список записей о сотрудниках:

export REQUEST_METHOD=GET
export QUERY_STRING='req=emp'
cgi-fcgi -connect /var/lib/vv/emp/sock/sock /

Использование командной строки

Каждое приложение Vely может работать как веб-приложение или как программа командной строки. Оба они также используют HTTP в качестве протокола, что упрощает разработку, тестирование, поддержку и использование приложения множеством различных способов.

Обратите внимание, что если вы планируете запускать приложение исключительно из командной строки, вам не нужен сервер приложений, поэтому в этом случае вам не нужна настройка веб-сервера и вам не нужно запускать сервер приложений с помощью процесса vf. управляющий делами. Это намного проще.

Чтобы запустить приложение из командной строки, укажите входные параметры в командной строке и запустите программу. Например, чтобы добавить сотрудника, укажите переменную среды REQUEST_METHOD (например, GET) и QUERY_STRING (укажите URL-адрес для добавления сотрудника) и вызовите программу:

export REQUEST_METHOD=GET
export QUERY_STRING='req=add_emp&first_name=Joe&last_name=Darling'
/var/lib/vv/bld/emp/emp

Результат:

Content-type: text/html;charset=utf-8
Cache-Control: max-age=0, no-cache
Pragma: no-cache
Status: 200 OK

Employee added

Если вы планируете сохранить результат в файле (например, для кэширования вывода приложения), вы можете опустить заголовок HTTP из вывода, выполнив следующие действия:

export VV_SILENT_HEADER=yes

Заключение

В этом руководстве вы узнали, как создать полнофункциональное веб-приложение, управляемое базой данных, с помощью Vely, которое использует MariaDB/mySQL в качестве базы данных и Nginx в качестве обратного прокси-сервера.

Например, вы могли бы использовать PostgreSQL и Apache, и это было бы очень похоже.

Вы также узнали, как запускать приложение разными способами: как сервер приложений или из командной строки. Вывод и поведение точно такие же, что полезно как для развертывания, так и для автоматического тестирования приложений.

Авторское право на изображение на обложке (c) 2022 Sergio Mijatovic


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE