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 上,使用包管理器,例如 dnf
或 apt
。
股票代码项目
本示例保存股票代码的名称及其价格,以便您可以在列表中查看它们。
首先创建 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 服务器上,proxy
和 proxy_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_name
和 stock_price
参数。非常容易。除了 req
之外,您可以随意选择参数名称。
查看 stock.v
中的代码,很容易理解。您可以使用 input-param 构造来获取输入参数的值。是的,C 代码中那些看起来不像 C 的奇怪的东西是 Vely 语言构造,它们为您做了很多有用的事情,例如 run-query,顾名思义,它会运行您的查询。一个简单的例子是 @
,它是一个 输出构造。字符串处理变得简单可靠,无需担心缓冲区溢出。查看 Vely 构造的完整参考 以了解 Vely 的功能。
Vely 将您代码中的所有构造转换为纯 C 代码,并生成一个非常小且快速的本机可执行文件。您的应用程序作为多个 FastCGI 服务器进程运行,这些进程驻留在内存中,同时接受和处理请求。所有这些进程都并行工作。
有关更多信息,请参阅 Vely 的工作原理 并阅读有关 Vely 架构 的更多信息。
管理字符串和内存
Vely 对其所有构造都具有自动垃圾回收功能。事实上,在大多数情况下,您根本不需要释放内存,因此应用程序开发更加简单。将此交给 Vely,享受免受内存泄漏之苦的计算,并且内存问题比您预期的要少得多。字符串构造(例如 write-string
)使创建复杂字符串与创建简单字符串一样安全、快速和容易。
FastCGI 程序管理器
即使您不想使用 Vely 开发自己的应用程序,您也可以将 vf
,Vely 的 FastCGI 程序管理器,与任何通用的 FastCGI 程序一起使用,而不仅仅是使用 Vely 创建的程序。
想了解更多关于 Vely 的信息吗?
我有时会被问到项目名称。Vely 是 Vel(ocit)y 的缩写。它编程速度快,代码易于理解和维护,运行时速度快(且体积小!)。甚至很容易容器化。
查看 vely.dev 上的文档,其中包含超出本文介绍范围的下载和示例。
评论已关闭。