用C++实现HTTP服务器V0.2 - 支持PHP

这篇博客介绍了作者使用C++实现的HTTP服务器V0.2,该版本新增了对PHP的支持。作者提到在源码设计中尽量避免过度封装,以保持代码清晰易懂,每个类的功能都能通过类名推测。由于作者不精通PHP,所以服务器的PHP支持未经详尽测试,计划在使用过程中逐步完善。
摘要由CSDN通过智能技术生成
Q++ HTTP Server v0.20
作者: 阙荣文


下载源码


前言
1. 关于版本号
就像爱因斯坦曾经说过,知道的越多,不知道的也越多.在改进 Q++ HTTP Server 的过称中,我越来越觉得还需要完成的工作太多,我自己有很多知识也不全面,之前的版本妄称1.5岂不是贻笑大方?然而,无知者无畏,因为我们敢想,敢干,敢犯错误,所以我们才能进步.
这个版本就姑且称为 0.20 吧,也是对自己的一个鞭策,希望能坚持下去直到真正的 1.00 版完成的那一天.

2. 关于造轮子
常常有人问我,现在有很多开源,高效,稳定的HTTP项目,如 Apache, Lighttpd, Nginx等,为什么还要花那么大精力去重复"造轮子"呢?就我个人来说,做这个东西很大一部分原因是因为闲着想练练手,结果越做越想把它完善下去,就这样一步步到了现在这个程度.关于造轮子,的确,一般情况下没有必要重复"发明轮子",我想说的是,正是因为有那么一群人愿意去"造轮子",所以才会不断有更新的,更好的"轮子"被造出来.

3. 关于 UNICODE
有那么一段时间,我非常推崇在程序中统一用 UNICODE 字符串,特别是在 WIN32 平台下.然而我意识到字符串的编码只是显示方面的问题不应该影响到程序内在的逻辑,现在更倾向于 ubuntu 那样使用 utf-8 作为前台字符编码.所以在这次修改中主要的几个类的接口全部使用 char 或者 std::string 而不再使用 wchar_t 或者 std::wstring (用 MFC 做的界面部分还是使用 UNICODE,这个与程序核心无关).

正文
1. 从 CGI 说起.
HTTP协议最早是为静态网页设计的,在那个蛮荒的年代,静态的文件共享已经足够让人惊喜了.随着时间的推移,在人类永无止境的需求面前,静态网页变得越来越力不从心.比如新闻网站,用人工的方式为每一个新发生的事件添加一个静态网页对编辑人员来说显然是个折磨.人们希望能够动态的生成网页,让计算机代替人类完成这类工作.最早出现的就是 CGI.
一个典型的 CGI URL 像这样:http://www.xxx.com/cgi-bin/getdate.exe 目的很简单,把服务器的日期显示在客户机浏览器上. 当Web 服务器接收的这样一个请求时,它就创建 /cgi-bin/getdate.exe 进程,重定向它的 stdin, stdout 和 stderr. 对于进程 /cgi-bin/getdate.exe 来说,它根本不知道Web服务器,也不知道客户端浏览器,它只是用 scanf 从标准输入读取参数,用 printf 向标准输出写结果,如果需要还可以用 getenv 从系统环境变量表中获得额外的参数. 由于 /cgi-bin/getdate.exe 进程的 stdin, stdout 和 stderr 已经被 Web 服务器重定向(常常用 pipe)所以 Web 服务器可以通过读写 pipe 向进程 /cgi-bin/getdate.exe 发送参数或者获取结果,然后再转发到客户端.
这一切看起来似乎非常完美: Web 服务器和 CGI 进程是相互独立的,并且 CGI 进程运行的环境非常单纯,不需要管Web服务器也不需要管客户端浏览器.程序员可以用任意他喜欢的语言来编写 CGI 进程或者脚本.但是,就像所有完美的东西总是不存在一样,CGI一样也有缺点,那就是:效率.对于每个客户请求,Web服务器都需要生成一个 CGI 进程来处理它,而生成进程的成本是很高的,并且一个操作系统中的总进程数也是有限制的,所以 CGI 无法应对大规模,高并发的访问需求.
CGI 之后,开始流行ASP,JSP/serverlet等.以JSP为代表,它们相对于 CGI 最大的区别是 JSP 使用线程而不是进程来处理客户端请求.线程的生成成本较低,也不用负担进程间通讯的成本,并且可以复用,就是说处理完一个客户端请求后,serverlet线程可以继续处理下
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值