lua源码分析
A. 服务器程序源代码分析之二:php-fpm
php作为排名top2 互联网开发工具,非常流行,可以参考:中国最大的25个网站采用技术选型方案
php这个名称实际上有两层含义
直接定义:
php-fpm从php5.3.3开始已经进入到php源代码包,之前是作为patch存在的
很少人会去读php本身源代码,我6年前解决php内存泄露问题的时候做了些研究,最近再查看了一番,发现php的开发者很有诚意,这是一款非常出色的服务器软件,支持如下
在linux服务器上,如果不设置 events.mechanism ,那么默认就是采用epoll,所以
php-fpm的IO模型&并发处理能力和nginx是完全一致
nginx以性能卓越闻名,大部分程序员都认为php效率低下,看了源代码,才知道这是传奇啊
在高性能部署的时候,大家往往会针对性的优化nginx 。我自己之前部署php程序也犯了错误,8G内存的server,php-fpm的max children都会设置128+,现在看来太多了,参考nginx的部署:
php-fpm配置为 3倍 cpu core number就可以了
php-fpm稳定性比nginx稍差 这是因为php-fpm内置了一个php解析器,php-fpm进程就和php程序捆绑了,如果php脚本写得不好,有死循环或者阻塞在某个远端资源上,会拖累加载它的php-fpm进程
而nginx和后端应用服务器之间通过网络连接,可以设置timeout,不容易堵死的
php-fpm的fastcgi是短连接 我原以为是长连接的,看了代码才知道也是短连接,处理一个request就关闭掉
php-fpm接口采用fastcgi 非常遗憾,php-fpm和fastcgi完全绑定了,无法独立使用 。只能部署在支持http-fcgi协议转换程序背后(nginx)。其实可以考虑在php-fpm代码包里面引入http协议支持,这样php-fpm可以独立运行,让nodejs无话可说
php-fpm等同于OpenResty OpenResty是一个国人开发的nginx模块,就是在nginx引入lua解释器. 实际上,它和php-fpm的唯一差别就是一个采用php语法,一个用lua,所以OpenResty要作为nginx增强包使用还可以,要选择它作为一个主要编程工具,没有任何必要
从架构上来说,php-fpm已经做到最好,超过大多数 python部署工具,我再也不黑它了
B. lua 解密
lua文件加密
这其实是你的理解错误
并不是被真正的加密,而是被做成机器码了,就是给机器看用的,所以也不可能复原
就像C代码用VC编译后生成EXE
不可再变回源代码是一个原理的
只能教你怎么把LUA源码变成机器码,
只要找到lua文件夹下的luac文件
在cmd下输入
luac
targFileName
--
tar是目标文件名,就会生成对应的机器码,
这只是你所谓的加密,解密就没办法了
C. lua解析器用什么写的
没有汇编,只有C语言,而且是最基本的C语言。
lua官方的解释器为保证lua解释器的可移植性和可嵌入性,用纯ANSI C写的,即其中只有保持最大兼容要求的标准C语言代码……通俗点说,没有使用任何各种编译器的方言语法以及更高版本的C语言语法,甚至没有使用复杂的函数库,在通俗点说就是只引入了std开头的那些C语言库,比如说常见的stdio.h和stdlib.h……
但是嵌入性是lua解释器的基本要求之一,你可以将其嵌入到自己的程序里面作为扩展,其本身也具有很强的扩展性,所以如果你问lua解释器本身,毫无疑问是C语言,如果是嵌入了lua的产品可能成分就并不单纯了……
源码可在此处下载到,整个源码只有五百来K,感兴趣可以看一下:
http://www.lua.org/download.html
D. 求LuaStudio下载地址
软件介绍
LuaStudio是一款非常好用的编程调试器软件,它是一款真正意义上的IDE、集成了编辑、工程管理、调试、远程调试等各种功能为一体,支持注入到宿主程序内对lua脚本进行调试,还可以设置断点观察变量的值,功能非常强大。
所需工具:点击下载:LuaStudio(编程调试器)
功能特色
1、语法高亮
luastudio支持Lua编程语言的语法高亮。用户可以自定义字体外观名称,字体大小,和其他格式的语法元素。
2、项目管理
luastudio提供了强大的项目管理功能。所有的项目管理功能,可从主菜单或项目可停靠的视图上下文菜单访问。
luastudio可以打开和管理在当时只有一个解决方案。一个解决方案可能包含一个或多个项目。一个项目可以有一个或多个文件夹,和一个文件夹可以包含一个或多个文件。
代码段
luastudio为用户提供了一套Lua代码片段。这些片段可以用Lua源文件。luastudio会检测当前在编辑单据类型,开关段设置和使用正确的文件。
3、lua脚本调试
luastudio提供了强大的调试功能,用户可以调试个人Lua脚本由官方的Lua解释器解释,或调试嵌入式LUA脚本的其他应用程序中嵌入lua解释器使用。luastudio会检测到目标应用程序类型,然后决定调试器的工作方式,无需手动完成。
4、符号视图
luastudio分析当前编辑lua的源码,所有功能和他们的名单中提取符号观。这意味着符号视图显示Lua源代码的轮廓。正如你所看到的,将组织的轮廓树的形式。如果项目中的符号视图用户双击,luastudio将跳线,函数的定义。
LuaStudio破解版安装教程
1、下载软件压缩包文件,点击“LuaStudio.exe”,根据提示完成软件安装
2、打开软件,我们可以看到软件提示的试用期到期时间为0天,
3、下载关闭LuaStudio程序,双击运行LuaStudio9.6.7无限试用补丁,点击“清除使用痕迹”选项
4、再次打开LuaStudio,点击“帮助”菜单----“注册授权管理”,然后就可以看到提示29天后过期。
E. Lua源码模块分析
外部符号的前缀表示其来自的模块:
在src / Makefile(5.1.1)中,mingw目标是不寻常的,因为它只构建lua(不是luac)。也可以添加mingw-cygwin目标。请参阅 BuildingLua中的 mingw注释来解决。
在SRC / luaconf.h(5.1.1),LUA_PATH_DEFAULT指的是LUA_LDIR和LUA_CDIR,但LUA_CPATH_DEFAULT仅指LUA_CDIR的这些。 RiciLake 建议这可能是一个安全决策,其中C模块需要比Lua模块更多的信任。
在src / luaconf.h(5.1.1)中,有一个LUA_CDIR"loadall.dll",在 [3] [4]中 讨论。
请参阅 GarbageCollection 和 EmergencyGarbageCollector中 的描述。
参见 LuaSourceTable
这在 BindingCodeToLua中 有所描述。
注意:“#define lmathlib_c”(和其他库中的类似行)只存在于luaconf.h中的条件(由lhf注释)。
F. Lua字符串拼接
之前研究lua中字符串拼接,看了一些文章都说 "table.concat" 高于 ".."。最近项目做优化,发现项目中使用table.concat的效率并不比..高,所以实际测试了一下。
1、一些文章说的"table.concat" 高于 "..",是在特定环境中才有效的,看一下他们使用的测试用例:
local str = "a"
local count = 100000
local start_time = os.clock()
local result = ""
for i=1,count do
result = result .. str
end
print("operatorConcatTime:" .. os.clock() - start_time)
local tbl = {}
for i=1,count do
table.insert( tbl,str)
end
table.concat(tbl)
print("tableConcatTime:" .. os.clock() - start_time)
运行后测试结果如上图,运行效率明显table.concat远高于..。在上述测试用例中,“..” 每次只拼接一个字符串,一共拼了10000次。“..”每次拼接都会产生一个新的字符串,而在lua中每产生一个新的字符串都需要将该字符串存放在全局状态表(global_State)的 strt 域中,随着拼接次数增大,就会需要更大的空间存储新的字符串,当达到一定大小时,旧的字符串就需要GC,伴随着不断的开辟新空间和GC,就导致性能降低。 而table.concat 底层拼接字符串的方式也是使用运算符.. ,但是其使用算法减少了使用运算符..的次数,减少了GC,从而提高效率。主要思路:采用二分思想,用栈存储字符串,新入栈的字符串与下方的字符串比较长度,大于则使用运算符..拼接成新字符串,并移除栈顶的字符串,不断向下直至遇到长度更大的字符串或者栈底,这样保持最大的字符串位于栈底,栈呈现金字塔的形状,最终在使用运算符..将栈中的字符串拼接成最终的字符串。引用( Lua大量字符串拼接方式效率对比及原因分析_AaronChan的博客-CSDN博客_lua 字符串拼接 )。
2、而在实际项目中一般都是几个字符串的拼接,拼接频次高,拼接个数少。针对项目中实际情况,写了如下测试用例测试:
(1)测试用例1:
function global_SpliceString (...)
local t = { ... }
return table.concat (t)
end
local count = 10 000
local sM1 = 0
local sM2 = 0
local start_time
collectgarbage("collect")
sM1 =collectgarbage("count")
print("sM1:",sM1)
local result = ""
start_time = os.clock()
for i = 1, count do
result =global_SpliceString("SELECT * FROM ", "QuestPlot", "WHERE sn='", i, "'")
end
print("CostTime:",(os.clock() - start_time))
sM2 =collectgarbage("count")
print("sM2:",sM2)
print("Genery Mem ory:" , (sM2 - sM1))
(2)测试用例2:
local count = 10 000
local sM1 = 0
local sM2 = 0
local start_time
collectgarbage("collect")
sM1 = collectgarbage("count")
print("sM1:",sM1)
local result = ""
start_time = os.clock()
for i = 1, count do
result = "SELECT * FROM" .. "QuestPlot" .. " WHERE sn='" .. i .."'"
end
print("CostTime:",(os.clock() - start_time))
sM2 =collectgarbage("count")
print("sM2:",sM2)
print("Genery Memory:",(sM2 - sM1))
(3)测试用例3:
local tb = {[1]= "SELECT * FROM ", [2] = "QuestPlot", [3] = " WHEREsn='", [4] = 100101, [5] = "'"}
collectgarbage("collect")
sM1 =collectgarbage("count")
print("sM1:",sM1)
local result = ""
start_time = os.clock()
for i = 1, count do
tb[4] = i
result = table.concat( tb )
end
print("CostTime:",(os.clock() - start_time))
sM2 =collectgarbage("count")
print("sM2:",sM2)
print("Genery Memory:",(sM2 - sM1))
测试结果如下所示:
(1)global_SpliceString:
(2)..
(3)table.concat:
为了模仿更真实的使用环境,以上三个测试用例中要拼接的字符串都有一个动态变化的字符串。通过结果比对,测试用例2和用例3的耗时和内存相差无几,而测试用例1的耗时和内存明显高出很多。通过查看lua源码知道,在一个语句中用“..”连续拼接几个字符串并不会产生中间字符串,而是会把所有需要连接的字符串都收集起来一起连接。所以table.concat和“..”的方式相差无几。再看测试用例1,同样使用table.concat,为什么用例1的耗时和内存明显增多。 是因为在 gobal_SpliceString() 方法中的 local t = { ... }, 每次调用这个方法都需要先构造一个table,然后才能使用table.concat。而table在lua中也属于GC对象,table的创建需要消耗更多时间和内存。同时调用global_SpliceString也会有函数调用消耗,所以用例1的性能消耗是由构造table导致的。
3、总结:
通过以上分析,我们不能简单的说table.concat和“..”谁的性能更好,还要根据具体使用场景,具体问题具体分析。一般如果一次拼接大量字符串并且要拼接的字符串基本都是固定的,可以使用table缓存起来,使用table.concat拼接;如果是动态的且比较少的字符串拼接,可以直接在一个语句中使用“..”连续拼接。
G. 请教lua如何反编译,或者指点一下luadec的用法,请不要复制回答问题。
搜:Lua脚本反编译入门教程。
H. lua语言实现中lua_State定义无法在源代码中找到,只找到了typedef struct lua_State lua_State。求教!
你看的那个不是源码,只是头文件。
源代码可以去官网下载
I. luacrul类库-ftp问题分析/解决
问题:使用smart_pub.kkf2中的 function t.upload(sftpTab) 函数ftp上传报错;
改函数使用了 LuaCURL库函数,网上先了解一下:
查了其他网站资料,对LUA的类库解释的很少,官网英文且解释的不全面,不容易理解,
所以参考php的libcurl库说明,语言不同,类似可以参考;
分析报错信息,初步理解为文件目录不存在,或者创建失败;定位:
查看系统关键源码设置:
源码【顺便在源码上加了注释,便于理解其他参数】
新增设置
测试问题解决:
还好之前使用过curl工具模拟webservice、rest客户端报文测试,相对通用理解一些,curllib库还有很多功能可能总结学习;
参考 http://luaforge.net/projects/luacurl/
http://underpop.free.fr/l/lua/luacurl/
https://www.cnblogs.com/endv/p/8433889.html