在《服务器架设笔记——使用Apache插件解析简单请求》一文中,我们已经可以获取请求内容。这只是万里长征的第一步。因为一般来说,客户端向服务器发起请求,服务器会有着复杂的业务处理逻辑。举个例子,大部分客户端软件都有日志模块。其中包含了用户的一些行为,比如你点击了某个按钮。客户端将该信息上报给服务端,服务端解析这些信息,并记录在案,以供运维和产品人员分析。而这种记录在案行为,一般不会是使用直接读写文件的方式,而是要使用数据库。所以打通数据库和服务器是非常重要的一环。(转载请指明出于breaksoftware的csdn博客)

我选择目前比较流行的MySQL。首先我们要先安装MySQL

apt-get install mysql-server

然后我们要安装MySQL的C++开发库。Apache的DBD模块要使用这个开发库

apt-get install libmysql++-dev

安装完毕后,我们手工建立一个数据库。之后我们创建的Apache插件只是将该数据库中的数据select出来。

登陆MySQL:

mysql -u root -p


        创建数据库log:

create database log;


        创建表query_log

use log;
create table query_log(id INT UNIQUE, query VARCHAR(128), time int);

插入两条数据

insert into query_log values(0, "query_log1“, 100);
insert into query_log values(1, "query_log2", 101);


        因为我们之前编译的APR-UTIL模块没有启动编译MySQL相关的库,所以我们要重新编译APR-UTIL

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-mysql
make
make install

再编译一下Apache

修改httpd.conf文件,放开mod_dbd.so的加载注释

使用《服务器架设笔记——编译Apache及其插件》中的方法生成一个插件use_mysql。使用如下方式让Apache连接到MySQL

static void query_database(request_rec *r) {apr_pool_t* pool = r->pool;const apr_dbd_driver_t* driver = NULL;apr_status_t status = apr_dbd_get_driver(pool, "mysql", &driver);if (APR_SUCCESS != status) {ap_rprintf(r, "apr_dbd_select error\n");return;}apr_dbd_t* handle = NULL;status = apr_dbd_open(driver, pool, "host=localhost;user=root;pass=password;dbname=log", &handle);if (APR_SUCCESS != status) {ap_rprintf(r, "apr_dbd_open error\n");return;}

其中需要注意的是apr_dbd_open中第三个参数,它标识了以什么用户名和密码打开哪台机器上的哪个数据库。这个参数根据数据库的类型不同而不同,比如针对sqlite型数据库就要传递数据库文件路径。

然后我们执行查询操作

 apr_dbd_results_t* res = NULL;const char* sql = "select * from query_log";status = apr_dbd_select(driver, pool, handle, &res, sql, 0);if (APR_SUCCESS != status) {ap_rprintf(r, "apr_dbd_select error\n");return;}

我们将query_log表中的所有数据都提取出来,然后遍历并输出结果

 apr_dbd_row_t* row = NULL;const char* id = NULL;const char* query = NULL;const char* time = NULL;while (apr_dbd_get_row(driver, pool, res, &row, -1) == 0 ) {id = apr_dbd_get_entry(driver, row, 0);query = apr_dbd_get_entry(driver, row, 1);time = apr_dbd_get_entry(driver, row, 2);if (id) {ap_rprintf(r, "id\t:\t%s\n", id);}else {ap_rprintf(r, "id is NULL\n");}if (query) {ap_rprintf(r, "query\t:\t%s\n", query);}else {ap_rprintf(r, "query is NULL\n");}if (time) {ap_rprintf(r, "time\t:\t%s\n", time);}else {ap_rprintf(r, "time is NULL\n");}}
}

如此,我们便将Apache和MySQL打通。我们发起一次请求,查看结果如下:

id   :   0
query   :   query_log1
time    :   100
id  :   1
query   :   query_log2
time    :   101
The sample page from mod_use_mysql.c

虽然现在写起来,感觉还是很顺畅。但是在研究这个问题时遇到了各种各样的问题,而且可以参考的资料都很少。所以在此记录,以便感兴趣的人可以少走弯路。

服务器架设笔记——打通MySQL和Apache相关推荐

  1. 服务器架设笔记——使用Apache插件解析简单请求

    一般来说,对于一个请求,服务器都会对其进行解析,以确定请求的合法性以及行进的路径.于是本节将讲解如何获取请求的数据.(转载请指明出于breaksoftware的csdn博客) 我们使用<服务器架 ...

  2. 服务器架设笔记——Apache模块开发基础知识

    通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API.虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统. ...

  3. 服务器架设笔记——多模块和全局数据

    随着项目工程的发展,多模块设计和性能优化是在所难免的.本文我将基于一些现实中可能遇到的需求,讲解如何在Apache的Httpd插件体系中实现这些功能.(转载请指明出于breaksoftware的csd ...

  4. CentOS4.4下邮件服务器架设笔记之windows AD整合功能实现

    1.通过"CentOS4.4下邮件服务器架设笔记之邮件网关功能实现"这一篇文章,我们已经实现了邮件网关功能,但是对于microsoft ad 平台下exchange邮件系统用户来说 ...

  5. 服务器架设笔记——编译Apache及其插件

    之前一直从事Windows上的客户端软件开发,经常会处理和服务器交互相关的业务.由于希望成为一个全栈式的工程师,我对Linux上服务器相关的开发也越来越感兴趣.趁着年底自由的时间比较多,我可以对这块做 ...

  6. RHCE课程-RH253Linux服务器架设笔记五-APACHE服务器配置(4)

    JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司一起参与建立的一种基于Java技术的动态网页技术标准. Apache只是一个Web服务器,不能运行JS ...

  7. 服务器架设笔记——httpd插件支持mysql字符集选择

    mysql数据库默认的字符集是latin1.默认情况下,我们编译的httpd插件是可以正常读取该类型的数据库,并且不会出现乱码.但是,如果我们的数据库变成其他格式,比如UTF8,那么默认读取出来的数据 ...

  8. 服务器架设笔记——搭建用户注册和验证功能

    之前介绍的Apache Httpd相关内容,都是些零散的知识点.而实际运用中,我们要根据不同的业务,将这些知识点连接起来以形成各种组合,来满足我们的需求.(转载请指明出于breaksoftware的c ...

  9. RHCE课程-RH253Linux服务器架设笔记五-DNS服务器配置(2)

    上季我们学习了,DNS的原理和bind软件的相关简介,还有安装架设了BIND软件的DNS服务器,还有就是正向区域和反向区域的一些技巧,今天我们要学的就是DNS的辅助服务器的架设,还有DNS的缓存域名服 ...

最新文章

  1. ruby中取反的问题
  2. 人工智能到底是啥_人工智能的本质究竟是什么?
  3. 图解Android - 如何看Android的UML 图?
  4. RNA干扰各种方法优缺点简介?
  5. zabbix3.4监控java_CentOS7,zabbix3.4通过,zabbix-Java-gateway监控Tomcat
  6. Linux工作笔记037---Centos下Linux创建用户_用户组_删除用户
  7. 批量自动下单(京东)
  8. Unity3d 2019室内光照贴图lightmap快速烘焙(转载)
  9. 神经网络学习笔记1——BP神经网络原理到编程实现(matlab,python)
  10. 打麻将 - 基于R语言
  11. 为什么苹果手机拍照会模糊?一起来看手机维修师如何解决
  12. web前端—前端三剑客之JS(12):字符串
  13. 网上商城建设:微信小程序直播申请开通流程及开通方法
  14. 1.10 python 基本数据类型-集合
  15. 虚拟机的桥接模式和NAT模式
  16. 把软件装进U盘,真正做到即插即用
  17. scipy.sparse.vstack
  18. cropper截图插件(自定义像素的图片并保存本地)
  19. 测试电磁波仪软件,电磁波辐射检测仪的使用方法_电磁辐射检测仪工作原理与应用...
  20. cartography在机器人上运行建图与定位

热门文章

  1. 一文看懂docker容器技术架构及其中的各个模块
  2. 使用Python和OpenCV检测图像中的条形码
  3. 使用Python,OpenCV生成Aruco标记
  4. SICK LMS151-10100使用攻略
  5. 2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷,73人天团,正式出道!
  6. Linux那些事儿 之 戏说USB(31)驱动的生命线(三)
  7. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集
  8. 一、多个txt文件合并成1个txt文件
  9. 如何查看OpenCV自带函数的源代码
  10. 剑指offer:面试题27. 二叉树的镜像