19 / 09 / 2013 buling

      话说很久没有写过文章了,自从离职后,进入tc也1个多月了,过的很忙,也很充实,现在发现比起后端我更爱前端,但潜意识还是觉得不够帅气,不够牛逼,所以还在努力挣扎着去接触cgi,原因也是因为这次的项目中有几个接口需要动态输出。现在回过头来看网站开发,把一个网站做牛逼,就应该把所有的静态化,动态内容全部异步或者定时生成再include,看业务需要。把所有的请求交给nginx来处理,至少不用再看着loading…………………………………………………
      今天中秋节,事情太多,加上环境不是很熟悉,实在处理不过来,今天就公司加班一天,上午把主要的事情处理了,下午来看看fastcgi相关信息,先来说cgi,再说fast-cgi。
一、cgi其实就是一个可执行的应用程序,apache在收到请求后交由你的这个应用来处理请求,如hello world来了

#include 
int main(){
    printf("Content-type:text/html\n\n");
    printf("Hello World\n");
    return 0;
}

编译一下:gcc hello.c -o hello;自己也可以测试一下 ./hello看看是否能正常打印
再把这个文件拷贝到 cgi-bin的目录,具体应该看apache配置 http.conf中站点的 ScriptAlias目录指定的地方
然后访问一下 http://站点域名/hello 看看是否正常输出了
这就是cgi,很简单吧,cgi不限制语言开发,装B的都是用C/C++,好像装。


那么什么是fastcgi呢,我去,随便找个hello你就啊,用个while包了一下cgi就是fastcgi,本想多高级,结果while都需要自己写,注意,hello来了。
http://www.fastcgi.com/devkit/doc/fastcgi-prog-guide/ch2c.htm

#include 
#include 
using namespace std;
int main(void){
    while(FCGI_Accept() >= 0){
        printf("Content-type: text/html\r\n");
		printf("hello world!");
    }
    return 0;
}

因为环境不好,没有测试,但我猜测是可以的,编译加入-lfcgi就可以了,至于cgi头文件..
下午看了一下内部的一个cgi的简单框架,写的很不错,也很简单,模板引擎用的是clearsliver (www.clearsilver.net/docs/c_api.hdf),其它过程就跟PHP扩展差不多过程,什么RINIT\MINTI之类的,业务只需要继承后写接口代码就行了。
顺便说一下再整个的学习过程中发现的两个点
1、在.h文件中加入 #pragma once 可以防止被多次加载,和编译环境有关系,普通的做法就是使用 #ifndef #define #endif;有点麻烦
2、#pragma pack() 例如:

#pragma pack(1)
struct sample{
    char a;
    double b;
};
#pragma pack()

注:若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节);若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制