内容简介:在上一章节学会了如何安装cf后, 本章节就会介绍cf到运行机制与httpd的server搭建!cf是一个非常典型的基于协程的事件驱动开发框架在封装成API后, 可以依赖事件循环执行一套稳定运行时环境.而lua本身提供了强大的
在上一章节学会了如何安装cf后, 本章节就会介绍cf到运行机制与httpd的server搭建!
cf是一个非常典型的基于协程的事件驱动开发框架在封装成API后, 可以依赖事件循环执行一套稳定运行时环境.
而 lua 本身提供了强大的 table
数据结构可以根据需要自行构建所谓的"config", 所以cf为了减少无用的依赖就没有提供额外的config文件进行配置.
cf会假设所有业务代码文件都在 script
目录下, 所以建议您在 script
下自行划分好文件的目录归属.
cf将所有业务编写的脚本目录命名为 script
, script
目录下点 main.lua
文件将会是入口文件. 这个 main.lua
执行完毕之后才会真正进入事件循环.
在执行完成 script/main.lua
文件后, cf则会是实际情况决定是否需要开始运行事件循环. 假设开发者仅仅想运行 print("hello world")
, 那么cf将会在 main.lua
执行完成后直接退出.
运行机制的问题与模块化的设计
main.lua
文件内部可以导入其它lua代码进行模块化设计, 但是有一点需要注意的是: cf框架在使用 require
导入文件时, 导入的文件只能用于定义不可用于流程执行.
什么意思呢? 例如, 当你在使用创建一个httpd实例之前会先创建DB对象并且进行初始化! 这时候您可以回设计像下面的代码:
-- mydb.lua local DB = require "DB" local db = DB:new { host = "localhost", port = 3306, database = "cfadmin", charset = 'utf8' -- ... } local ok = db:connect() if not ok then return nil end return db 复制代码
-- main.lua local db_cls = require "mydb" --[[ ... do your want do ]] 复制代码
这样做你会得到一个错误提示:"attempt to yield from outside a coroutine", 这个错误提示的中文大概意思就是: "不能在非协程的环境下切换执行权".
这是因为require函数的对指定的脚本调用的Call方法使其不允许临时切换出执行权, 而初始化数据库连接操作是依赖cf的协程与异步操作所以就会导致上面的错误出现.
可以将mydb.lua与main.lua的代码替换成下面这样(Cache库同理)来解决:
-- mydb.lua local DB = require "DB" local db return function () if db then return db end db = DB:new { host = "localhost", port = 3306, database = "cfadmin", charset = 'utf8' -- ... } local ok = db:connect() if not ok then db:close() db = nil return nil, "连接失败" end return db end 复制代码
-- main.lua local get_db = require "mydb" local db = get_db() -- [[ ... do your want do ]] 复制代码
这是用一种巧妙的function与upvalue的方式避开了require的内部call调用, require返回后执行权重新回到了由cf启动的协程中. 这样就可以开始正确初始化了.
这种情况仅限于依赖require执行某段 异步代码块 的时候, 其它情况下一般不会出现问题. 优质的项目管理人员一般不会出现这样的设计.
使用httpd库快速搭建lua web开发环境
httpd库是cf内置的基于http 1.1协议开发的web server! 高效解析器是必不可少的, httpd库使用picohttpparser解析器来构建http context.
我们假设您至少看过httpd库的 API Reference , 并且至少知道下面所述的API.
此处所有的API与使用方式都将会在 API Reference 中找到.
1. 导入http库
httpd库位于 app/lualib
下, 使用者可以在 main.lua
文件内直接使用 local httpd = require "httpd"
导入httpd库.
2. 初始化一个httpd app对象
httpd库使用lua class对象进行创建! 默认提供了new方法, 使用者可以使用new方法创建一个httpd的app实例.
local httpd = require "httpd" local app = httpd:new("app") 复制代码
3. 注册静态文件路径
httpd提供给了内置的静态文件查找能力, 只需要使用者自动使用static方法注册静态文件路径即可.
app:static("static", 30) 复制代码
static表示使用者想将 app/static
文件夹当做静态文件的根目录.
4. 设置监听端口
httpd启动需要指定监听的端口, 默认监听所有网卡. 虽然没有使用第一个参数, 但是不可为空.
app:listen("0.0.0.0", 8080) 复制代码
5. 运行
在初始化完成后, app调用 run
方法将会启动httpd服务器. run
方法后面的代码可能永远不会有机会执行.
app:run() 复制代码
6. 运行cf
使用 ./cfadmin
命令运行httpd server, 如果您看到类似 运行
等字样说明httpd服务已经启动完成, 否则将会有响应的错误提示.
7. 完整的代码示例
-- script/main.lua local httpd = require "httpd" local app = httpd:new("app") app:static("static", 30) app:listen("0.0.0.0", 8080) app:run() 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- linux 内核开发指南 - 2 开发流程
- 面向Java开发人员的Flex开发指南
- (是时候开发属于自己的插件了)数据校验插件开发指南
- 原 荐 Play For Scala 开发指南 - 第9章 Json 开发
- 原 荐 Play For Scala 开发指南 - 第10章 MongoDB 开发
- NGINX 开发指南
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。