文档章节

Lua Web快速开发指南(2) - cf的运行机制简介与基于httpd库的开发环境搭建

水果糖的小铺子
 水果糖的小铺子
发布于 06/14 01:42
字数 1418
阅读 35
收藏 0

从本章开始假设大家都熟悉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()

体验一下

现在, 让我们打开http://localhost:8080/index.html查看是否能正确显示页面了呢?

更多的httpd API

这里你可以找到更多有关httpd库的API说明.

继续学习

一下章我们一起学习如何用cf来注册注册路由

© 著作权归作者所有

水果糖的小铺子
粉丝 23
博文 153
码字总数 73315
作品 1
广州
程序员
私信 提问
Lua Web快速开发指南(1) - 初识cf框架

cf是什么? cf全称为: CoreFramework. 一个基于Reactor事件驱动与协程的lua高性能网络框架, 目前主要面向HTTP Application开发. cf内部主要实现了包括HTTP与HTTP Over Websoket协议的Server,...

水果糖的小铺子
06/14
137
0
Lua Web快速开发指南(3) - 初识httpd库路由

本章假设您已经知道httpd server如何快速搭建, 并且知道cf的启动流程与运行流程, 知晓httpd如何创建与启动. 回顾上一章节 我们利用httpd内置库快速实现了一套httpd静态文件server, 其中包括静...

水果糖的小铺子
06/14
22
0
core_framework —— 基于libev的轻量级lua网络开发框架

大道至简, 返璞归真. 前言 在发表这篇博文的前夕, 还有一些小伙伴在提问一些以下相关的问题: 性能怎么样? 是否容易上手? 开发目标在哪? 如何反馈问题? 对比行业内的lua开源项目有何优势? 等...

水果糖
03/27
89
0
轻量级 lua 网络开发框架 - core_framework

core_framework 是一个基于 libev 的轻量级 lua 网络开发框架。 cf使用lua脚本语言进行服务端业务逻辑开发, 在其内部实现了多种网络协议与第三方库用来帮助使用者进行项目原型的快速开发. c...

水果糖
03/27
1K
1
cf 0.3.1发布, 持续更新与优化 Lua Web 应用框架

core_framework 是一个基于 libev 的轻量级 lua 网络开发框架。cf 使用 lua 脚本语言进行服务端业务逻辑开发, 在其内部实现了多种网络协议与第三方库用来帮助使用者进行项目原型的快速开发。...

水果糖的小铺子
07/01
693
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
8分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
8分钟前
2
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
13分钟前
2
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
14分钟前
2
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
19分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部