用C++开发网站/Web应用的2种思路


Coder Life Technologies

从纯静态网页,到aspx,到Flash网站,到php,到java,再到python,C++。经过了许多的取舍抉择。我更喜欢的还是C++。其次选择Java。

首先选择C++做网站,就要了解优势在哪里,劣势在哪里。

优势

安全 服务器上是编译好的二进制执行文件,就算别人获得了webshell,也无法简单地通过文本编辑器就对你的逻辑层进行改变,也无法窥探到你的逻辑层,而且因为是C++二进制执行文件,你还可以更灵活地比如让它自动判断运行环境,自我销毁、警告、报告给你它在哪个陌生的环境运行,用户是谁等等等等。总之相对其他的来说,理论上安全性绝对是最优的。

高效 其他的方案大多数是非编译语言,那么它们都需要相对应的二进制文件对其进行处理,各种解析之后得到结果,我们是直接的二进制执行文件,当然有人可能听说过C++的CGI性能低下,其主要原因是直接用传统CGI的思想,每次一个访问,就运行一个进程,启动结束进程本来就需要时间,到了并发多的时候更是直接把内存给爆了(应该说什么都能给爆了),但C++是强大的,我们可以让它以有限的进程数常驻在内存中,循环处理请求,每一个进程又可以以多线程的方式工作,而且每个进程只要维持一个数据库连接(实际上可以根据web服务器和数据库服务器的实际情况测量确定一个最优值),这样不仅可以保证不会崩掉数据库服务器,而且相比起每个请求都要建立一次数据库连接的方式(其他方案大多是如此),又能省掉建立数据库连接的时间,提速不少。而且你可以根据实际情况将任何读写较频繁的数据加载并常驻到进程的内存中实现最快的响应速度。实测在Apache Fastcgi和Nginx Fastcgi下,用上述方案和php分别完成最简单的数据库查询输出和包含文件,上述方案的效率比php快近3倍!上述方案是一种相当有效的高并发、高负载解决方案。如果你还嫌不够,可以连Apache、Nginx都省掉,直接写成httpd,当然这个我是不推荐的。

稳定 根据前面的叙述,显而易见。

强大 毫无疑问是最强大的,你可以使用任何C/C++库,你的程序功能和你其他的C/C++程序比,几乎没有任何缺失,只是用得到用不到的问题而已。

劣势

开发效率低 这是硬伤,C++的开发效率和它的执行效率一样是众所周知的,一般而言,开发效率与执行效率确实是成反比的。但这个能通过开发一些适当的库得以缓解,甚至能和php媲美,这就需要C++(和C++11)的一些特性了,这就是为什么选择C++而不是C的原因。

也许你还会说还有不易维护,不易调试等缺点,这也是存在的,但也是可以解决或缓解的。

好了,看到这里不知道你还有没有兴趣。如果你也想用C++来做网站的话,不妨参考以下我正在使用的2种思路(因为我已经将其实现都封装在了自己的库里,你可能需要花费额外的时间来让你的编译器能成功编译以下代码)。

思路1:

webroot的结构大致如下:

当用户访问网站时,不管uri是什么,都交由index.cgi处理,调用对应的函数,其中可能会读取html中的文件,这些文件可以用Django的模版语言。而这个文件夹是用户是没有访问权限的,因为它只供index.cgi读取并处理。js和css文件夹中就是静态文件。
这种思路非常像python的django开发的应用,只是把py文件变成cpp文件并编译成了二进制文件。非常方便移植。
(我是在了解python的web框架之前采用的这种方案,只不过html采用的不是Django的模版语言,而是自己随便定义的一套规范,仅有变量和判断功能,后来接触了Django之后,把html的书写规范改成了和Django一致)

思路2:
webroot的主体基本上就一个index.cgi不需要html、js、css,完全的C++风格编程。
其中cpp源码的urlproc部分如下:

编译成index.cgi后当用户访问任意url时,index.cgi都根据url调用对应的函数,然后生成css、js、html返回给浏览器。

希望此文能对你有所帮助,如果你觉得有收获,想进一步交流,可以通过侧边栏上的联系方式联系我。