当前位置: 首页 > Web前端 > HTML5

Luaweb快速开发指南(二)——介绍cf的运行机制和基于httpd库的开发环境

时间:2023-04-05 13:04:35 HTML5

从这一章开始,假设大家已经熟悉了lua语法。在上一章学习了如何安装cf后,本章将介绍cf的运行机制和httpd服务器搭建!cf是一个非常典型的基于协程的事件驱动开发框架封装成API后,可以依靠事件循环来执行一个稳定的运行环境。而lua本身提供了一个强大的表数据结构,可以根据需要构建所谓的“config”,所以使用cf来减少无用的依赖。没有为配置提供额外的配置文件。cf会假设所有的业务代码文件都在script目录下,所以建议大家划分script下文件的目录归属。cf将业务编写的所有脚本目录命名为script,脚本目录下的main.lua文件将作为入口文件。main.lua执行完后,才会真正进入事件循环。script/main.lua文件执行后,cf会根据实际情况决定是否启动事件循环。.假设开发者只想运行print("helloworld"),那么当main.lua执行完成后cf会直接退出。运行机制和模块化设计的问题模块可以在main.lua文件中引入其他lua代码但是需要注意一点:cf框架使用require引入文件时,引入的文件只能用于定义但不适用于流程执行。这是什么意思?例如,当您在使用之前创建一个httpd实例时,首先创建DB对象并初始化它!此时你可以回忆起如下代码:--mydb.lualocalDB=require"DB"localdb=DB:new{host="localhost",port=3306,database="cfadmin",charset='utf8'--...}localok=db:connect()ifnotokthenreturnnilendreturndb--main.lualocaldb_cls=require"mydb"--[[...doyourwantdo]]这样,你会得到一个错误信息:“attempttoyieldfromoutsideacoroutine”,这个错误信息的中文意思是:“不能在非协程环境中切换执行权限”。这是因为require函数对指定脚本的Call方法不允许临时切换出执行权,而初始的数据库连接操作依赖于cf的协程和异步操作,所以会出现上述错误。可以用mydb把.lua和main.lua的代码换成下面的(缓存库同理)解决:--mydb.lualocalDB=require"DB"localdbreturnfunction()ifdbthenreturndbenddb=DB:new{host="localhost",port=3306,database="cfadmin",charset='utf8'--...}localok=db:connect()如果不正常则db:close()db=nilreturnnil,"Connectionfailed"endreturndbend--main.lualocalget_db=require"mydb"localdb=get_db()--[[...doyourwantdo]]聪明的函数避免了这种情况,并且upvalue调用require的内部调用,require返回后,执行权返回到cf启动的协程。这样就可以开始正确的初始化了。这种情况仅限于依赖require执行某个异步代码块时,其他情况一般不会有问题。优质的项目经理一般不会有这样的设计。使用httpd库快速搭建luaweb开发环境。httpd库是基于http1.1协议开发的CF内置的web服务器!高效的解析器必不可少是的,httpd库使用picohttpparser解析器来构建http上下文。我们假设您至少阅读了httpd库的API参考,并且至少知道下面描述的API。这里所有的API和使用方法都可以在APIReference.1中找到。导入http库httpd库位于app/lualib下,用户可以直接在main.lua文件中使用localhttpd=require"httpd"来导入httpdpdlibrary.2.初始化一个httpdapp对象httpd库使用lua类对象创建!默认提供新方法,用户可以使用新方法创建httpd的app实例。localhttpd=require"httpd"localapp=httpd:new("app")3.注册静态文件路径httpd提供了内置的静态文件搜索能力,用户只需要自动使用静态方法注册静态文件路径即可。app:static("static",30)static表示用户想将app/static文件夹作为静态文件的根目录。4.设置监听端口httpd启动时需要指定监听端口,默认监听所有网卡。第一个参数虽然不用,但不能为空。app:listen("0.0.0.0",8080)5.Run初始化完成后,app调用run方法启动httpd服务器。run方法背后的代码可能永远没有机会执行。app:run()6.使用./cfadmin命令运行cf来运行httpdserver,如果看到running的字样,说明httpd服务已经启动,否则会有response错误提示。7.完整代码示例--script/main.lualocalhttpd=require"httpd"localapp=httpd:new("app")app:static("static",30)app:listen("0.0.0.0",8080)app:run()体验现在我们打开http://localhost:8080/index.html看看页面是否可以正确显示?更多httpdAPI在这里您可以找到更多关于httpd库的API描述。继续学习章节,我们来学习如何使用cf注册注册路由