不知道你是不是曾经发愁过使用FastCgi库来使用C++开发Fastcgi程序繁琐而且会与C++ STL代码产生冲突的地方,或者你还是习惯了cout而不是pringf,那这篇文章就可以了解到一个使用的比较少的FastCgi 的C++库  —— FastCgi++ / FastCgipp。

开发环境:

  OS: Centos 7

  编译器:gcc 4.8.3

准备:

  1. 我的yum源中没有找到Fastcgi++,而且,正如我以往的习惯来说,我还是比较喜欢源码编译 : )

    FastCgi++ 官方介绍: http://www.nongnu.org/fastcgipp/

      下载 源码:最新版本为2.1版本 http://download.savannah.nongnu.org/releases/fastcgipp/fastcgi++-2.1.tar.bz2

  2.  国外大多数开源库中都会使用Boost库,所以,免不了需要安装libboost-devel。参考Mongodb中对Boost库的安装。或者直接yum install boost-devel,也就仅仅是依赖这一个非标准库,所以不需要安装其他。

  3.  由于是FastCgi Application ,选一个一个WebServer来验证他的执行成果。选择Nginx,我的Nginx版本为1.6.0

编译:

  1.  这一段确实也没什么好说的

      tar -xvjf fastcgi++-2.1.tar.bz2

      ./configure --disable-shared --enable-static

      make && make install

  再不指定prefix的路径的情况下,GCC编译也就会到默认的路径去寻找头文件与库文件。这里,我选择编译成了静态库的形式,不需要数据库有关的操作,不需要编译进去.

基本使用:

开始使用:

   

/**
* Fastcgi++ Test by kk
* main.cpp
*/ #include <boost/date_time/posix_time/posix_time.hpp>
#include <fstream>
#include <fastcgi++/request.hpp>
#include <fastcgi++/manager.hpp>
void error_log(const char* msg)
{
using namespace std;
using namespace boost;
static ofstream error;
if(!error.is_open())
{
error.open("/tmp/errlog", ios_base::out | ios_base::app);
error.imbue(locale(error.getloc(), new posix_time::time_facet()));
}
error << '[' << posix_time::second_clock::local_time() << "] " << msg << endl;
}
class HelloWorld: public Fastcgipp::Request<wchar_t>
{
bool response()
{
wchar_t russian[]={ 0x041f, 0x0440, 0x0438, 0x0432, 0x0435, 0x0442, 0x0020, 0x043c, 0x0438, 0x0440, 0x0000 };
wchar_t chinese[]={ 0x4e16, 0x754c, 0x60a8, 0x597d, 0x0000 };
wchar_t greek[]={ 0x0393, 0x03b5, 0x03b9, 0x03b1, 0x0020, 0x03c3, 0x03b1, 0x03c2, 0x0020, 0x03ba, 0x03cc, 0x03c3, 0x03bc, 0x03bf, 0x0000 };
wchar_t japanese[]={ 0x4eca, 0x65e5, 0x306f, 0x4e16, 0x754c, 0x0000 };
wchar_t runic[]={ 0x16ba, 0x16d6, 0x16da, 0x16df, 0x0020, 0x16b9, 0x16df, 0x16c9, 0x16da, 0x16de, 0x0000 };
out << "Content-Type: text/html; charset=utf-8\r\n\r\n";
out << "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
out << "<title>fastcgi++: Hello World in UTF-8</title></head><body>";
out << "English: Hello World<br />";
out << "Russian: " << russian << "<br />";
out << "Greek: " << greek << "<br />";
out << "Chinese: " << chinese << "<br />";
out << "Japanese: " << japanese << "<br />";
out << "Runic English?: " << runic << "<br />";
out << "</body></html>";
err << "Hello apache error log";
return true;
}
};
int main()
{
try
{
Fastcgipp::Manager<HelloWorld> fcgi;
fcgi.handler();
}
catch(std::exception& e)
{
error_log(e.what());
}
}

  使用GCC将其编译:g++ -o main -lboost_system-mt -lboost_thread-mt -lfastcgipp main.cpp

验证:

  由于是一个FastCgi程序,所以就需要一个lighthttpd项目中一个fastcgi启动器spawn-fastcgi(好吧,暂且先启动器这么叫,我想在下面的文章源码具体探索一下spawn-fastcgi的执行过程)

  网上关于spawn-fastcgi的教程很多,编译起来也不难。贴上源码下载路径就好:http://www.lighttpd.net/download/lighttpd-1.4.19.tar.gz

  更改Nginx配置文件 nginx.conf 在server中加入fastcgi配置:

  

location ~\.fcgi$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.fcgi;
fastcgi_param SCRIPT_FILENAME /$fastcgi_script_name;
include fastcgi_params;
}

  重启Nginx重新加载配置文件。

  运行spawn-fastcgi程序:  

    spawn-fastcgi -a 127.0.0.1 -C 20 -p 9000 main

  成功提示:spawn-fcgi: child spawned successfully: PID: 13404

  现在打开浏览器,输入localhost/test.fcgi就能看到C++代码输出的值了。

后记:

  以前一直使用的FastCgi库,但是这是一个C语言的库,用C++来开发使用极其不方便,而且会出现一些不知名的错误。FastCgi++使用OOP设计,能完美的使用C++来开发FastCgi程序。在后面的文章会详细的介绍FastCgi++的使用方法。 :)  工作愉快

一个好用且方便的FastCgi C++库 - FastCgi++的更多相关文章

  1. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  2. Numeral.js 是一个用于格式化和数字四则运算的js 库

    1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...

  3. 一个很cool的C#的高性能数学库

    High Performance Math Library for C# and .NET是一个很cool的C#的高性能数学库,3D效果也很不错,下图是首页上的一个例子.他也有一个交互的网页,你可以自 ...

  4. Bean-Query 一个把对象转换为Map的Java工具库

    刚开源了一个经过完整測试的Java工具类. 地址例如以下: https://github.com/Jimmy-Shi/bean-query 使用说明例如以下: Bean-query Click Her ...

  5. [C#] BarcodeLib -- 一个精简而不失优雅的条形码生成库

    BarcodeLib -- 一个精简而不失优雅的条形码生成库 引言 在百度进行“C# 条形码”等类似关键字搜索的时候,基本上是使用 ZXing 类库进行条形码的生成.今天我所介绍的是另一款类库 Bar ...

  6. Linux下一个最简单的不依赖第三库的的C程序(1)

    如下代码是一段汇编代码,虽然标题中使用了C语言这个词语,但下面确实是一段汇编代码,弄清楚了这个代码,后续的知识点才会展开. simple_asm.s: #PURPOSE: Simple program ...

  7. BarcodeLib -- 一个精简而不失优雅的条形码生成库

    BarcodeLib -- 一个精简而不失优雅的条形码生成库 引言 在百度进行“C# 条形码”等类似关键字搜索的时候,基本上是使用 ZXing 类库进行条形码的生成.今天我所介绍的是另一款类库 Bar ...

  8. htpwdScan — 一个简单的HTTP暴力破解、撞库攻击脚本

    李姐姐之前跟我们分享了子域名枚举工具subDomainBrute<subDomainsBrute — 改进渗透测试时暴力枚举子域名的python脚本>,这回带给我们htpwdScan ht ...

  9. 使用 js 实现一个中文自动转换成拼音的工具库

    使用 js 实现一个中文自动转换成拼音的工具库 中文 => zhong-wen 应用场景 SEO 友好, URL 自动转换 blogs 发布文章,自动化部署,自动生成 url 的 path (时 ...

随机推荐

  1. Commons Configuration2 - Quick start guide

    原文:http://commons.apache.org/proper/commons-configuration/userguide/quick_start.html Reading a prope ...

  2. SNMP监控一些常用OID的总结

    做网络监控的人对SNMP的协议肯定够很熟悉,下面罗列出一些常见的OID说明,方便大家省去查阅相关资料的麻烦. 系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2 ...

  3. [转] Portable Trac 简单介绍 - 兼谈为什么不选择 Redmine

    Portable Trac 简单介绍 - 兼谈为什么不选择 Redmine ​Trac是一个轻量级的软件项目管理环境,如果在工作中涉及一个开发团队的管理并且关心项目管理工具的话,相信都在 ​Trac. ...

  4. iOS开发——Touch ID 指纹识别

    项目中为了安全性,一般使用密码或iPhone手机的指纹识别Touch ID. 第一步,判断系统是否支持,iOS8.0及以上才支持. 第二步,判断手机是否支持,带Touch ID的手机iPhone5s及 ...

  5. JavaScript学习笔记(10)——JavaScript语法之操作DOM

    1.页面输出用document.write()方法,但是不可以在window.onload中用,否则整个html页面将被覆盖. 2.通过javascript获取对象后,改变对象中的html内容:doc ...

  6. linux(ubuntu)和windows下面快速搭建android开发环境

    在windows和linux下面搭建android开发环境,一般要安装以下几个软件: 1.JDK安装 2.Eclipse安装 3.Android SDK安装 4.在eclipse里面安装ADT 5.e ...

  7. js画了一个椭圆

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 利用js来实现一些常用的算法

    示例代码中的arr指的是给出的数组,s指的是数组的起始坐标0,end指的是数组的最后一个坐标arr.length-1,n指的是要查找的数字 查找某个值: 1.线性法 function findInAr ...

  9. C++ typedef用法小结

    一.typedef的四个用法 用法一: 为复杂的声明定义一个新的简单的别名.方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版.举例 ...

  10. NOIP201101&&05

    NOIP200701奖学金 难度级别:A:            运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述    某小学最近得到了一笔赞助 ...