解决方案:
不过Lua为我们提供了可能的解决方案: 将Lua引擎直接嵌入shttpd。
如果将Lua直接嵌入shttpd,那在处理CGI请求的时候,我们不再需要创建新的
进程,而只需要创建一个新的Lua解释器,并交给一个线程去执行就可以了,这样
不仅在效率上有了提高,也可以适应某些古老的不支持多进程的操作系统了(在
这样的系统上,需要把shttpd也嵌入到主程序当中去)。为了传递原来用环境变
量方式传递的数据,我们在执行脚本之前,在新创建的Lua的解释器里创建一个叫
REQUEST的mapping类型的变量,将所有的数据设置在这个变量中。这样在脚本中
就可以直接使用这个变量了。
CGI程序还必须能够从标准输入接收POST请求,以及从标准输出发送HTML页面。
这一点可以通过修改shttpd,为Lua引擎扩展两个函数来实现,分别是HTTPRead和
HTTPWrite。在脚本中调用这两个函数来实现输入和输出。为了使用方便和习惯,
再把标准的print和io.read函数指向HTTPWrite和HTTPRead(函数在Lua中是第一
类型)。
这两个问题解决之后,剩下的就是用Lua脚本写一个简单的CGI开发框架了,
LuaCGI就是一个很好的框架,只需要把它所使用的SAPI替换成shttpd提供的
接口就可以了。
|