在 Linux 上使用 Vely 编写 C 应用程序

Vely 是一款开源工具,用于在主要的 Linux 发行版上使用 C 语言编写 Web 和命令行应用程序。
4 位读者喜欢这篇文章。
Woman sitting in front of her computer

Ray Smith

Vely 是一款用于使用 C 语言编写 Web 和命令行应用程序的工具。Vely 结合了 C 语言编程的高性能和低占用空间,以及类似于 PHP 等语言的易用性和更高的安全性。它是免费和开源软件,并根据 GPLv3 和 LGPL 3 许可协议(针对库)获得许可,因此您甚至可以使用它构建商业软件。

Vely 可在主要的 Linux 发行版和处理器架构上运行。您可以使用 Web 服务器,例如 Apache、Nginx 或其他服务器,以及数据库,例如 MariaDB、PostgreSQL 和 SQLite。

您可以将 Vely 用于 Web 应用程序、命令行程序、作为中间件、数据库应用程序、服务软件、数据集成、物联网 (IoT) 以及任何其他地方。它非常适合云环境,可以轻松地在容器中运行,并且由于资源需求低,因此在内存和处理能力有限的情况下也是一个不错的选择。

安装 Vely

要试用 Vely,请安装 Apache Web 服务器和 MariaDB 数据库。您可以使用不同的 Web 服务器和数据库,设置方法类似,但在本示例中,我使用 Apache 和 MariaDB。

接下来,安装 Vely。在 Linux 上,使用包管理器,例如 dnfapt

股票代码项目

本示例保存股票代码的名称及其价格,以便您可以在列表中查看它们。

首先创建 stock.v 文件,并将以下代码粘贴到其中

#include "vely.h"

void stock() {
   out-header default
   @<html>
       @<body>
       input-param action
       input-param stock_name
       input-param stock_price
       if (!strcmp (action, "add")) {
          // Add to stock table, update if stock exists
          run-query#add_data@db = "insert into stock (stock_name,\
              stock_price) values ('%s', '%s') on duplicate key \
              update stock_price='%s'" : stock_name, stock_price, \
              stock_price
           end-query
           error#add_data to define err
           if (strcmp (err, "0")) {
               report-error "Cannot update stock price, error [%s]", err
           }
           @<div>
              @Stock price updated!
           @</div>
       } else if (!strcmp (action, "show")) {
         // Show stock names and values
           @<table>
               @<tr>
                   @<td>Stock name</td>
                   @<td>Stock price</td>
               @</tr>
               run-query#show_data@db = "select stock_name, \
                    stock_price from stock" output stock_name, \
                    stock_price
                   @<tr>
                       @<td>
                       query-result#show_data, stock_name
                       @</td>
                       @<td>
                       query-result#show_data, stock_price
                       @</td>
                   @</tr>
               end-query
           @</table>
       } else {
           @<div>Unrecognized request!</div>
       }
       @</body>
   @</html>
}

构建数据库

对于本示例,创建一个名为 dbstock 的数据库,由用户 vely 拥有,密码为 your_password。这些是任意名称,在实际应用中,您可以使用任何您想要的值,只要它们在您的代码中保持一致即可。

首先,以 root 用户身份登录到 MariaDB 数据库并执行以下操作

create database if not exists dbstock;
flush privileges;
create user if not exists vely@localhost identified by 'your_password';
flush privileges;
grant all privileges on dbstock.* to vely@localhost;
flush privileges;
exit;

现在再次登录到 MariaDB 并设置当前数据库

$ mysql -u vely -pyour_password

现在您可以创建应用程序所需的数据库对象。在本示例中,您需要在 dbstock 数据库中创建一个 stock 表。

use dbstock;
create table if not exists stock (stock_name varchar(100) primary key, stock_price bigint);

最后,创建一个名为 db 的数据库配置文件,以便您的应用程序可以登录到数据库。您必须将其命名为 db,因为这是 stock.v 中的代码使用的名称。例如

[...]
run-query#add_data@db = "insert into stock ..."
[...]

数据库名称前面带有 @ 符号,在本例中为 @db,因此数据库配置文件的名称为 db。与其他值一样,您可以将数据库配置文件命名为您想要的任何名称,只要您的代码保持一致即可。

以下是 db 文件的配置

[client]
user=vely
password=your_password
database=dbstock

以上是标准的 MariaDB 客户端选项文件。Vely 使用原生数据库连接,因此您可以指定给定数据库允许的任何选项。

构建应用程序

接下来,您可以创建您的 Vely 应用程序。在本示例中,您将创建一个名为 stockapp 的 Web 应用程序

$ sudo vf -i -u $(whoami) stockapp

这将在 Vely 目录 (/var/lib/vv) 下创建一个应用程序主目录,并为您执行所需的应用程序设置步骤。

要构建您的应用程序,请使用 vv 命令

$ vv -q --db=mariadb:db stockapp

以下是每个选项的含义

  • -q 构建一个应用程序
  • --db 指定要使用的数据库(mariadb:db,如您的配置文件中所指定)
  • stockapp 是应用程序名称

实际上,您可以在应用程序中使用任意数量的数据库和不同的供应商。不过,本示例很简单,因此您只需要一个数据库。Vely 还有许多其他有用的选项可以使用,但现在这些就足够了。

配置 Web 访问

要通过 Web 浏览器或各种 Web 客户端访问您的应用程序,您需要设置一个 Web 服务器。它可以是 Apache、Nginx 或任何其他支持 FastCGI 代理的服务器(大多数 Web 服务器和负载均衡器都支持此功能)。在这里,我将设置 Apache,但其他 Web 服务器的设置类似。

在 Fedora 安装的 Apache Web 服务器上,proxyproxy_fcgi 模块默认安装并启用,但您必须在基于 Debian 的系统(如 Ubuntu)上启用它们

$ sudo a2enmod proxy
$ sudo a2enmod proxy_fcgi
$ sudo systemctl restart apache2

如果您不是在基于 Debian 的系统上,您可以通过将 Apache 模块添加到 Apache 配置文件或 /etc/httpd/conf.modules.d/ 目录中的文件中来启用它,具体取决于您的发行版的配置。

接下来,在文本编辑器中打开您的 Apache 配置文件。例如,在基于 Debian 的系统上

$ sudo vi /etc/apache2/apache2.conf

在 Fedora 系统(包括 Red Hat Enterprise Linux 和 CentOS)上

$ sudo vi /etc/httpd/conf/httpd.conf

将以下行添加到文件末尾

ProxyPass "/stockapp" unix:///var/lib/vv/stockapp/sock/sock|fcgi://localhost/stockapp

根据您的 Web 服务器配置,可能有一个更好的位置来添加 ProxyPass 指令。不过,对于本示例而言,以上内容就足够了。

保存文件并重启 Web 服务器。在基于 Fedora 的系统上

$ sudo systemctl restart httpd

在基于 Debian 的系统上

$ sudo systemctl restart apache2

在本例中,您通过套接字连接到您的应用程序,但您也可以使用 TCP 端口(当您的应用程序位于容器或类似环境中时,这会派上用场)。

运行应用程序

为您的应用程序启动应用程序服务器

$ vf stockapp

默认情况下,这会为您的应用程序运行 0 到 20 个服务器进程,具体取决于负载。当用户负载较低时,您的应用程序几乎不占用任何内存。

就是这样!在您的 Web 浏览器中导航到 http://127.0.0.1/stockapp?req=stock&action=add&stock_name=XYZ&stock_pri… 以查看应用程序。

您刚刚将股票代码 “XYZ” 的价格更新为 440。尝试不同的股票代码和价格来构建股票列表,您可以使用 URL http://127.0.0.1/stockapp?req=stock&action=show 查看该列表。

恭喜您,您已经创建了您的第一个 Vely 应用程序,它通过 Web 服务器进行反向代理。

您还可以通过 使用 curl 在没有图形浏览器的情况下查看输出

$ curl -s \
"http://127.0.0.1/stockapp?req=stock&action=add&stock_name=XYZ&stock_price=440"
$ curl -s "http://127.0.0.1/stockapp?req=stock&action=show"

从终端运行应用程序

您也可以从终端运行您的应用程序。终端命令始终与 FastCGI 应用程序服务器一起创建,并且它的名称与您的应用程序相同(在本例中为 stockapp)。它的工作方式与 Web 应用程序完全相同。您可以编写一些请求让您的应用程序作为 Web 请求来满足,另一些请求从命令行运行。为此,您需要将请求作为环境变量提供。例如,要将股票列表输出为 HTML,请键入

$ export REQUEST_METHOD=GET
$ export QUERY_STRING="req=stock&action=show"
$ /var/lib/vv/bld/stockapp/stockapp

要抑制 HTTP 标头,请使用

$ export VV_SILENT_HEADER=yes
$ /var/lib/vv/bld/stockapp/stockapp

Vely 的工作原理

您的应用程序通过处理请求并发送回回复来工作。请求是两种 HTTP 方法之一:GET 或 POST。

请求始终有一个参数 req。在此示例中,其值为 stock。这意味着从文件 stock.v 编译的源代码会被自动调用来处理此类请求。

像这样的源文件可以做许多不同的事情,所有这些事情都逻辑地分组在一个请求下。在这里,您有另一个参数 action,它可以具有 add(添加或更新股票)或 show(显示股票列表)的值。添加或更新时,您需要指定 stock_namestock_price 参数。非常容易。除了 req 之外,您可以随意选择参数名称。

查看 stock.v 中的代码,很容易理解。您可以使用 input-param 构造来获取输入参数的值。是的,C 代码中那些看起来不像 C 的奇怪的东西是 Vely 语言构造,它们为您做了很多有用的事情,例如 run-query,顾名思义,它会运行您的查询。一个简单的例子是 @,它是一个 输出构造。字符串处理变得简单可靠,无需担心缓冲区溢出。查看 Vely 构造的完整参考 以了解 Vely 的功能。

Vely 将您代码中的所有构造转换为纯 C 代码,并生成一个非常小且快速的本机可执行文件。您的应用程序作为多个 FastCGI 服务器进程运行,这些进程驻留在内存中,同时接受和处理请求。所有这些进程都并行工作。

有关更多信息,请参阅 Vely 的工作原理 并阅读有关 Vely 架构 的更多信息。

管理字符串和内存

Vely 对其所有构造都具有自动垃圾回收功能。事实上,在大多数情况下,您根本不需要释放内存,因此应用程序开发更加简单。将此交给 Vely,享受免受内存泄漏之苦的计算,并且内存问题比您预期的要少得多。字符串构造(例如 write-string)使创建复杂字符串与创建简单字符串一样安全、快速和容易。

FastCGI 程序管理器

即使您不想使用 Vely 开发自己的应用程序,您也可以将 vfVely 的 FastCGI 程序管理器,与任何通用的 FastCGI 程序一起使用,而不仅仅是使用 Vely 创建的程序。

想了解更多关于 Vely 的信息吗?

我有时会被问到项目名称。VelyVel(ocit)y 的缩写。它编程速度快,代码易于理解和维护,运行时速度快(且体积小!)。甚至很容易容器化。

查看 vely.dev 上的文档,其中包含超出本文介绍范围的下载和示例。

接下来阅读什么

C 编程语言是如何发展的

这是我对 Brian Kernighan(《C 编程语言》一书的合著者,另一位是 Dennis Ritchie)的采访,讨论 C 编程语言及其 50 年的历史。

(通讯员)
2022 年 4 月 15 日
标签
me as a cartoon
我从十几岁开始编程,并通过获得计算机科学硕士学位(以及电子工程学士学位,当需要换灯泡时,这会派上用场)将其作为我的职业,然后在多家公司工作,包括在 Oracle 的核心工程部门担任高级软件工程师超过 10 年。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可协议获得许可。
© . All rights reserved.