Open hanxi opened 9 years ago
参考: http://alilua.com/docs.html
$ git clone https://github.com/oneoo/alilua.git $ cd alilua $ make
这是调整后的目录,将alilua作为子工程放入工程目录。
project/ ├── alilua/ # alilua源码目录 ├── css/ ├── js/ ├── scripts/ # lua脚本目录 │ ├── index.lua │ └── upload.lua ├── template/ # html模板目录 │ └── index.html ├── restart.sh # 快速重启脚本 ├── route.lua # alilua路由脚本 ├── host-route.lua # alilua路由配置 └── uploaddir/ # 上传文件目录
./alilua process=4 bind=9999 daemon host-route=host-route.lua
stop() { pid=`ps -ef| grep "alilua" | grep -v grep | awk '{print $2}' ` if [ "$pid"x != x ]; then kill -9 $pid echo "stop alilua" fi }
rts, err = dotemplate("/template/index.html")
__root
host-rote.lua
host_route['*'] = '/home/hlm-devel/www/ordering/route.lua'
route.lua
core.lua
index.html
header.html
footer.html
jsonrpc_handle
get_post_body
get_request_body
http://alilua.com/docs.html#jsonrpc_handle
db.lua
mysql
connect
require
参考:https://github.com/oneoo/alilua/issues/27 因为 require 过程中产生的 Lua 运行环境不是一个协程,所以会报 attempt to yield across C-call boundary 错误。 你把 require 改为 dofile 就可以运行的。 如果非要使用require,则需要在 db.lua 里面把数据库操作封装成 function ,再给调用者使用。我用的是这种方式。 文件上传的实现 不想用 alilua 示例中那个 form 的例子的实现方式(标准的 html post 请求方式) 我采用 AJAX 实现 post 请求传文件内容, url 参数中传文件名的方式实现。 AJAX 发送 post 请求遇到 sendAsBinary 函数在谷歌浏览器被移除的问题。 谷歌一搜就有解答
参考:https://github.com/oneoo/alilua/issues/27
因为 require 过程中产生的 Lua 运行环境不是一个协程,所以会报 attempt to yield across C-call boundary 错误。
attempt to yield across C-call boundary
你把 require 改为 dofile 就可以运行的。
sendAsBinary
if(!xhr.sendAsBinary){ xhr.sendAsBinary = function(datastr) { function byteValue(x) { return x.charCodeAt(0) & 0xff; } var ords = Array.prototype.map.call(datastr, byteValue); var ui8a = new Uint8Array(ords); this.send(ui8a.buffer); } }
read_request_body
uploaddir
<a
<a href="data:text/csv;,xxxxxx"></a>
code-cache-ttl
host-route.lua
config['lua-path']='xxxx/?.lua;'
vhost.c
lua_path = get_string_in_table(L, "lua-path", &tl);
worker.c
lua_path
package.path
sprintf(buf_4096 + epd->vhost_root_len + 1, "?.lua;%s/lua-libs/?.lua;%s", process_chdir, lua_path);
源代码在这里:https://github.com/hanxi/alilua-demo-ordering
在此感谢alilua的作者oneoo在百忙之中抽空帮助我解答疑问
一、搭建环境
参考: http://alilua.com/docs.html
下载和编译alilua
设定网站目录
这是调整后的目录,将alilua作为子工程放入工程目录。
快速重启脚本(方便快速调试)
./alilua process=4 bind=9999 daemon host-route=host-route.lua
二、快餐点餐工具需求
三、开始编码
index.lua和模板的使用
rts, err = dotemplate("/template/index.html")
__root
变量保存主路径,而__root
来源于host-rote.lua
中配置host_route['*'] = '/home/hlm-devel/www/ordering/route.lua'
中route.lua
的父目录路径。core.lua
中实现的函数参数涉及到文件时,都会加上__root
前缀,所以在使用这些函数的时候不需要自己添加__root
。index.html
我就用到了模板中的include命令用来包含header.html
和footer.html
使用jsonrpc实现api请求
jsonrpc_handle
函数,而且get_post_body
函数的名字改成了get_request_body
。jsonrpc_handle
函数的实现,拷贝出来修改get_post_body
,在新版本中依然可以使用。http://alilua.com/docs.html#jsonrpc_handle
实现远程RPCjsonrpc.js的实现
MySQL数据库操作的封装(alilua的require和dofile)
db.lua
文件封装用到的mysql操作db.lua
中执行mysql
的connect
函数,不能使用require
包含文件,因为read_request_body
循环读取 post 内容存入uploaddir
目录下面。js实现下载csv数据
<a
标签实现:<a href="data:text/csv;,xxxxxx"></a>
添加luapath到配置文件
code-cache-ttl
的配置host-route.lua
文件中添加luapath的配置:config['lua-path']='xxxx/?.lua;'
vhost.c
文件中添加全局变量lua_path:lua_path = get_string_in_table(L, "lua-path", &tl);
worker.c
中把lua_path
加入到package.path
中:sprintf(buf_4096 + epd->vhost_root_len + 1, "?.lua;%s/lua-libs/?.lua;%s", process_chdir, lua_path);
源代码在这里:https://github.com/hanxi/alilua-demo-ordering
在此感谢alilua的作者oneoo在百忙之中抽空帮助我解答疑问