shttpd php,shttpd和Lua组合-提供嵌入式web服务

文章介绍了如何在资源有限的环境下,利用shttpd(一个小型Web服务器)和Lua(轻量级脚本语言)的组合提供Web服务。在WinCE平台上,由于其对标准C库的支持不完整,需要对Lua进行移植。通过将Lua引擎直接嵌入shttpd,可以避免传统CGI的进程创建和环境变量问题,提高了效率。此外,还提到了使用LuaCGI框架编写CGI脚本的方法,使得这种组合成为嵌入式应用的理想选择。
摘要由CSDN通过智能技术生成

简单介绍:

lua是一个小巧的脚本语言,专用于嵌入和扩展。它和C/C++代码有着良好

的交互能力。由于体积小,很适合嵌入到其他程序中为程序提供脚本功能。

lua在大多数平台上都可以顺利编译、运行。网址 外链网址已屏蔽www.lua.org

shttpd是一个小巧的web服务器,小巧到只有一个.c文件,4000余行代码。

虽然体积很小,却具备了最基本的功能,比如CGI。它既可以独立运行,

也可以嵌入到其他的应用程序当中。shttpd在大多数平台上都可以顺利

编译、运行。网址

应用方式:

很多设备都提供Web服务用于配置,比如路由器,ADSL猫等等。这种设备所

提供的web服务的典型用例是用户填写一些参数,提交给Web服务器,Web服务器

将这些参数写入硬件,并将操作结果或者其他信息生成页面返回给浏览器。

如果使用Apache,PHP,MySQL这种组合,一方面资源未必能承受,另一方面这些

硬  件所使用的操作系统也未必能支持这些软件(如pSOS,VxWorks,WinCE)。

如果shttpd和lua结合起来,一个用来提供基本的web服务,另一个用来编写

CGI脚本,应该是一个很不错的选择。他们都具备体积小,占用资源少的特点,

又都宣称源码级可移植。如果有更高的需要,也可以把sqlite加入,提供数据

库服务(sqlite是一个嵌入式的数据库,同样体积小巧,并且可以在很多平台

上工作)。不带sqlite,体积仅仅300k,加上sqlite大约500k,对于嵌入式应

用非常合适。

向WinCE移植:

虽然lua使用的是比ANSI还要小的clean C,并且号称在所有平台上不用修改

任何东西就可以直接make成功,但是WinCE却是一个例外。事实上,对大多数

源码级可移植的C/C++程序,WinCE都是一个例外:因为它对标准C库的支持是

不完整的。

Lua 5.0版本的时候,有人提供了一个for WinCE的移植,工作的很好。基于

这个移植,我把Lua 5.1也移植了过去。因为Lua使用的是clean C,所以需要

做的改动不算很多,具体参看代码中的lua.c,lua.h,error.h和luacerun.c就

明白了。

shttpd就麻烦得多了,一方面它使用的是ANSI C,需要自己实现的函数更多,

比如文件读写,线程操作等。这些部分虽然麻烦,但是我还是一个个的把这些

缺失的函数自己实现了。更严重的是,WinCE 缺失了两个必不可少的特性:

管道和环境变量。

传统的CGI执行原理是web server通过管道将CGI程序的标准输入输出重定向,

从而向CGI程序发送数据并接收其输出的结果,同时通过设置CGI进程的环境变量,

将HTTP请求的各种信息传递给CGI程序,其中包括GET命令的查询串。这两个功能

WinCE都没有。 重定向的问题,可以通过编写特殊的WinCE驱动模拟解决,但是

也很受限制,使用不便;环境变量的问题则一点办法也没有了。

解决方案:

不过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提供的

接口就可以了。

总结:

用shttp+lua的组合,可以在各种不同的平台,尤其是嵌入式平台上提供web服务

,满足在资源有限的环境中工作的需要。由于Lua是直接嵌入到shttpd中的,它

有着比一般的CGI更高的效率。

评论列表

老梆菜2014-4-7 15:44:00

好!

能否在 arm7/arm9 的 linux 上运行?

jason2014-4-7 15:44:00

这套代码在linux上不需要移植

移植都是为WinCE作的。

arm应该也不是问题,我现在用的是intel xscale.

xueluowutong2019-2-21 16:03:00

楼主,能发我一份能在wince下运行的lua源代码么?

xueluowutong2019-2-21 16:03:00

楼主,能发我一份能在wince下运行的lua源代码么? 我的邮箱:xiekai902@163.com

发表评论

您还没有登录,请[登录]或[注册]

好库简介 | 网站地图 | 帮助中心 | 版权说明

Copyright© 2009-2012 OKBASE.NET All Rights Reserved 好库网 版权所有

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值