在基于 Web 的生产环境中使用 mSQL
在过去几年中,许多公司已经意识到使用 Linux 为大众提供 Web 内容的好处。一个免费提供的、功能丰富的 32 位操作系统,加上大量的实用程序和开发工具,为实施企业和公开可用的信息服务器提供了一种经济高效的解决方案。
虽然许多组织已经拥护 Linux 作为 Web 服务器,但很少有人利用 Web 最有趣的方面之一:动态内容生成和交付。想想看。在您经常访问的所有网站中,有多少网站具有静态内容?不多。我们很多人每天都会访问 Yahoo!,看看“互联网上有哪些新鲜事”。许多人整天都在 CNN 上关注新闻。这些网站都有动态内容。如果 Yahoo! 上的列表不是每天都更新,我们有多少人会在第一次访问后再次访问呢?
为了向您的网络访客提供动态内容,您可以使用各种工具和方法。一种更流行的方法是将数据存储库与 Web 集成。创建与现有数据库池集成的基于 Web 的应用程序似乎是今年的潮流。这种范式催生了一些令人惊叹的第三方产品,例如 Bluestone Software 的 Sapphire/Web (http://www.bluestone.com/) 和 Haht Software 的 HahtSite (http://www.haht.com/)。这些产品为设计、创建和部署基于 Web 的应用程序提供了完整的开发环境。不幸的是,这些产品中的大多数尚未在 Linux 上可用(暂时忽略 iBSC 选项)。但是,还有另一种选择。
您可以改造基于 Linux 的 Web 服务器,以非常经济高效的方式提供对企业数据的访问。第三方软件包通常具有集成开发环境 (IDE),以提供无缝、相对轻松的开发。这可以很容易地被您最喜欢的文本/HTML 编辑器取代。第三方软件包通常可以很好地与昂贵的、专有的数据库平台(如 Oracle、Sybase 和 Informix)接口。这些数据库系统花费数千美元,通常需要经验丰富的数据库管理员 (DBA) 才能有效运行。在我们的 Linux 模型中,我们将采用 David Hughes 的 mSQL 引擎,它的成本仅为 170 美元,而且使用起来非常简单。要完全实施这种方法,预计仅软件就需要花费不少于 10,000 美元。Linux/mSQL 方法(包括 Linux CD-ROM 发行版、mSQL 引擎和咖啡的成本)应该在 250 美元左右。高层管理人员一直对省钱情有独钟——向他们展示数字。它本身就很有说服力,伙计们。
在本文中,做出以下假设
您有一个可用的、完全安装的 Linux 服务器。
您有一个正在运行的功能性 HTTP 服务器(NCSA、CERN、Apache 等)。
您已安装 BASH、pdksh 或 ksh93。
您已安装了标准的 Unix 工具(awk、sed、Perl 等)。
您需要的第一个项目是 mSQL(mini Structured Query Language)引擎本身。mSQL 软件包实现了一个相对快速、轻量级的数据库引擎,它使用 ANSI SQL 标准的子集来执行其操作。截至撰写本文时,当前的稳定版本是 1.0.16,尽管期待已久的 v2.0 版本已承诺很快发布。可以通过 ftp 在 ftp://bond.edu.au/pub/Minerva/msql/ 获取。mSQL 的官方主页位于 http://Hughes.com.au/。
接下来,您需要 w3-msql 软件包,它也是由 David Hughes 编写和分发的。此软件包提供了 CGI(通用网关接口)接口,用于访问由 mSQL 管理的数据库。截至撰写本文时,w3-msql 的当前版本是 1.0,尽管 2.0 正在开发中。可以通过 ftp 在 ftp://bond.edu.au/pub/Minerva/w3-msql/ 获取。
最后,本文中提供的示例脚本可以通过 ftp 在 ftp://www.dcicorp.com/pub/unix/msqlweb/ 获取。除非您是一位打字爱好者并且已经熟悉 mSQL,否则我建议您获取这些示例。
获得分发存档后,将其移动到临时目录或常规源树的根目录。您可以按如下方式解压缩软件包
gzip -d msql-1.0.16.tar.gz tar xf msql-1.0.16.tar
要准备编译,请切换到 ./msql-1.0.16 目录并执行以下命令
make target cd targets/Linux* ./setup系统会询问您以下有关软件包实际构建的问题。以下是一些指导说明
安装树的根目录? 虽然 mSQL 几乎可以安装在系统上的任何位置,但您应该使用默认路径 /usr/local/Minerva。这使得安装第三方插件更容易。
此安装是否将以 root 身份运行? 此问题主要与 mSQL 用于网络通信的 TCP 端口有关。如果您的发行版以 root 身份运行,则默认 TCP 端口为 1112;否则使用端口 4333。您可以在 ./common/site.h 头文件中定制这些默认值。此外,请查看 mSQL 网站上提供的 mSQL FAQ,其中描述了此设置影响的其他一些场景。
PID 文件的目录? 您将 PID 文件保存在哪里?默认值为 /var/adm,这对大多数人来说都可以。
此时,脚本将完成其定制过程。在您实际编译软件包之前,您可以通过编辑一些源文件来执行多项自定义。第一个文件 ./common/site.h 包含一些精彩内容,例如选择德语而不是英语进行错误报告。快速浏览一下,确保您对这些设置感到满意。另一个可能的修改位于 ./msql/msql_priv.h 文件中。我喜欢稍微提高我的数据库限制。此文件的顶部有几个您可以根据需要更改的值,包括查询中返回的最大字段数、允许的最大网络连接数以及字段和表名的最大长度。您可以随意修改这些值以适应您的需求。对于不爱冒险的人来说,默认值应该足够了。
要编译软件包,只需从基本源目录 (./targets/Linux*) 执行以下命令
make all
在奔腾级机器上编译通常需要一分钟多一点的时间。如果没有编译器错误,您可以通过执行以下命令安装软件包
make install系统安装在 /usr/local/Minerva 中(或您在运行 setup 时设置的安装目录)。
编译和安装 w3-msql 实用程序要简单得多。获得分发存档后,将其解压缩到您的源目录或临时目录中,如下所示
gzip -d w3-msql-1.0.tar.gz tar xf w3-msql-1.0.tar
更改到 w3-msql-1.0 目录,并删除对 make 变量 LIBS 的 -lsocket -lnls 赋值。Linux 不需要将这些库链接到应用程序中。运行 make,您就可以开始工作了。如果构建成功,只需将 w3-msql 二进制映像复制到您的 Web 服务器的 cgi-bin 目录即可。
mSQL 服务器进程需要在您机器的启动过程中调用。在您的 /etc/rc.d/rc.local 文件中放置类似于以下内容的一行
/usr/local/Minerva/bin/msqld&
为了测试目的,并为您节省重启时间,请从 shell 提示符执行上述命令。这将启动并运行服务器进程,准备处理您的数据库请求。
为了确保您的 mSQL 服务器已正确安装,mSQL 分发存档中提供了多个测试脚本。最后,请务必花时间查看 mSQL 文档。
作为本文的一部分,将完整展示一个功能齐全的基于 Web 的数据库应用程序。目的是为您的 Web 工作提供框架,并展示使用标准 Unix 工具构建这些类型的应用程序的便捷性。
我们的示例侧重于创建和交互一个数据库,该数据库包含音乐会列表,其中包含每场音乐会的多个信息项。首先,我们专注于使用一系列音乐会列表填充数据库,然后构建一些基于 Web 的查询。
在我们创建数据库模式本身之前,我们需要确定应用程序的功能要素。哪些信息需要存储在数据库中?将向我们的网络访客提供哪些类型的查询?我们需要能够允许通过 Web 添加其他音乐会条目吗?
我们的数据库存储音乐会日期、开场表演嘉宾、主唱表演嘉宾、地点和票价。目前,我们专注于简单的查询,例如按乐队名称和地点查找音乐会。我们还假设“添加”页面受到 HTTPD 身份验证的保护,或者通过 Intranet 提供。
以下是我们用来创建音乐会数据库的 mSQL 模式
create table notices ( show_date char(10), headliner char(30), opening_act char(30), location char(30), ticket_price char(10) )
要创建示例数据库并加载初始数据,请执行示例存档中的 mkconcerts 脚本。对于那些没有 ftp 访问权限的人,数据如清单 1 所示。
要验证数据是否已正确加载,请执行 mkreport 脚本(参见 清单 2. mkreport 脚本),该脚本也位于示例存档中。此脚本只是将数据库的内容转储到一个格式化的表中,称为 concert.listings,如 清单 3.concert.listings 文件 所示
现在数据库已创建并填充了测试数据,是时候开始构建与数据库交互的 HTML 页面了。(请记住,本文旨在补充而不是取代 mSQL 和 w3-msql 附带的文档。)
w3-msql 充当 HTML “预处理器” 的某种形式。它接受一个标准 HTML 文档,并根据嵌入的 mSQL 原语执行数据库操作,如图 1 所示。

图 1. 流程图
作为第一个示例,请考虑名为 ex1.html 的 HTML 文档,如 清单 4. 带有嵌入式 mSQL 命令的 HTML 文档 所示,它演示了指向包含嵌入式 mSQL 命令的文档的简单链接。
请注意调用过程。文档名称紧跟在 w3-msql (PATH_INFO) 的调用之后。w3-msql 获取此文档,查找任何嵌入的 mSQL 命令,并将适当的输出发送到客户端。在本例中,我们请求 query1.html 文档,其中包含 清单 5. HTML 文档 中所示的 HTML。选择后,w3-msql 链接的输出如图 2 所示。

图 2. ex1.html/query1.html 的输出
虽然前面的示例很简单,但它演示了从 mSQL 数据库呈现信息的简易性。让我们继续这个示例,扩展我们的查询。要实现的一个不错的功能是能够生成按特定字段排序的列表。考虑以下对我们的 ex1.html 文件的重写,它添加了多个超文本链接,每个链接都按不同的字段排序。该文件名为 ex2.html,如清单 6 所示。
请注意添加了 ?sortby=?????? 参数。我们创建新变量,进行初始赋值,并将该变量以及文档名称(现在称为 query2.html)传递给 w3-msql。我们使用 sortby 变量来包含我们希望在其中对列表进行排序的字段名称。
现在我们已经为前端编写了框架,实际查询模板需要进行哪些更改?考虑对 query.html 的重写,现在适当地称为 query2.html,如清单 7 所示。
唯一的主要更改是在 mSQL select 语句中。我们添加了标准的 ANSI SQL order by 子句,并传递了我们新的 sortby 变量的内容。此外,请注意使用 mSQL print 命令在表上方的标题中显示排序字段名称。sortby location 显示如图 3 所示的 HTML 表格。

图 3. 按地点排序的音乐会数据
为了完成我们的简单查询示例,让我们回顾一下按地点搜索的概念。让我们允许用户手动输入城市名称,并将其传递给 w3-msql 进行查询。考虑一下简单的 HTML 文档 ex3.html,如清单 8 所示。它在表单中提供了一个输入字段,链接到 w3-msql 作为表单处理器。
处理实际按城市查询的 query3.html 文档如清单 9 所示。请注意 mSQL select 语句中的更改。我们使用 ex3.html 文档中表单字段的内容作为类似 where 的 SQL 子句的值。
要测试此表单,请输入 New York 作为城市名称——图 4 显示了输出。

图 4. 基于表单的查询结果
关于执行对 mSQL 数据库的简单查询,就总结到这里。尝试使用不同的表和界面设计进行实验。尝试使用框架。在一个框架中放置搜索表单,在另一个框架中放置查询结果。使用 Linux/mSQL 方法,可能性是无限的。
B. Scott Burkett 曾是一名 Unix 系统程序员和技术讲师,现在是 Decision Consultants, Inc 的互联网服务经理,该公司是美国最大的软件服务咨询公司之一 (http://www.dcicorp.com)。他喜欢美国职业棒球大联盟(加油勇士队)、好的爵士酒吧、摆弄 Linux 以及在第三世界国家破坏军事阴谋。您可以通过电子邮件 scottb@dcicorp.com 与他联系。