从本章开始假设你们都熟悉lua语法.html
在上一章节学会了如何安装cf后, 本章节就会介绍cf到运行机制与httpd的server搭建!git
cf是一个很是典型的基于协程的事件驱动开发框架在封装成API后, 能够依赖事件循环执行一套稳定运行时环境.github
而lua自己提供了强大的table
数据结构能够根据须要自行构建所谓的"config", 因此cf为了减小无用的依赖就没有提供额外的config文件进行配置.web
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
导入文件时, 导入的文件只能用于定义不可用于流程执行.app
什么意思呢? 例如, 当你在使用建立一个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库是cf内置的基于http 1.1协议开发的web server! 高效解析器是必不可少的, httpd库使用picohttpparser解析器来构建http context.
咱们假设您至少看过httpd库的API Reference, 而且至少知道下面所述的API.
此处全部的API与使用方式都将会在API Reference中找到.
httpd库位于app/lualib
下, 使用者能够在main.lua
文件内直接使用local httpd = require "httpd"
导入httpd库.
httpd库使用lua class对象进行建立! 默认提供了new方法, 使用者可使用new方法建立一个httpd的app实例.
local httpd = require "httpd"
local app = httpd:new("app")
复制代码
httpd提供给了内置的静态文件查找能力, 只须要使用者自动使用static方法注册静态文件路径便可.
app:static("static", 30)
复制代码
static表示使用者想将app/static
文件夹当作静态文件的根目录.
httpd启动须要指定监听的端口, 默认监听全部网卡. 虽然没有使用第一个参数, 可是不可为空.
app:listen("0.0.0.0", 8080)
复制代码
在初始化完成后, app调用run
方法将会启动httpd服务器. run
方法后面的代码可能永远不会有机会执行.
app:run()
复制代码
使用./cfadmin
命令运行httpd server, 若是您看到相似运行
等字样说明httpd服务已经启动完成, 不然将会有响应的错误提示.
-- 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()
复制代码
如今, 让咱们打开http://localhost:8080/index.html
查看是否能正确显示页面了呢?
在这里你能够找到更多有关httpd库的API说明.
一下章咱们一块儿学习如何用cf来注册路由