魏长东

weichangdong

正在查看: lua 分类下的文章(第 2 页 / 共 34 篇)

lua的lor学习

最近学习lua,看到了lor框架。然后找了几套代码,然后部署在了虚拟机上。算是入了门。

 

第一个,可以登录,亮点是可以markdown写文章,还可以预览、

litle_blog.png

 

 

 

 

 

 

»»阅读全文

编写高性能的Lua代码

使用Local

在代码运行前,Lua会把源码预编译成一种中间码,类似于Java的虚拟机。这种格式然后会通过C的解释器进行解释,整个过程其实就是通过一个 while循环,里面有很多的 switch...case语句,一个 case对应一条指令来解析。

自Lua 5.0之后,Lua采用了一种类似于寄存器的虚拟机模式。Lua用 来储存其寄存器。每一个活动的函数,Lua都会其分配一个栈,这个栈用来储存函数里的活动记录。每一个函数的栈都可以储存至多250个寄存器,因为栈的长度是用8个比特表示的。

有了这么多的寄存器,Lua的预编译器能把所有的local变量储存在其中。这就使得Lua在获取local变量时其效率十分的高。

举个栗子: 假设a和b为local变量, a = a + b的预编译会产生一条指令:

;a是寄存器0 b是寄存器1
ADD 0 0 1

但是若a和b都没有声明为local变量,则预编译会产生如下指令:

GETGLOBAL    0 0    ;get a
GETGLOBAL    1 1    ;get b
ADD          0 0 1  ;do add
SETGLOBAL    0 0    ;set a

所以你懂的:在写Lua代码时, 你应该尽量使用local变量

以下是几个对比测试,你可以复制代码到你的编辑器中,进行测试。

a = os.clock()
for i = 1,10000000 do
  local x = math.sin(i)
end
b = os.clock()
print(b-a) -- 1.113454

把math.sin赋给local变量sin:

a = os.clock()
local sin = math.sin
for i = 1,10000000 do
  local x = sin(i)
end
b = os.clock()
print(b-a) --0.75951

直接使用 math.sin,耗时1.11秒;使用local变量 sin来保存 math.sin,耗时0.76秒。可以获得30%的效率提升!

»»阅读全文

lua七宗罪

因为擅长写php,而且lua刚学,所以有些估计是我水平不够才会这么认为的。

第一宗 不能很好的计算table长度。比如这样的

local all_sids = {

        ['1'] = 'Facebook',

        ['2'] = 'API',

        ['3'] = 'Google',

        ['16'] = 'MV',

['27'] = 'Mopub',

}

第二宗 函数默认值不能放在参数上,需要写到函数里面。

这是错的

function wcd(n=2)

end

需要这样

function wcd(n)

n = n or 2

end

第三宗 table数字变量,必须加方括号单引号,不然没法访问。

这样是错的

local all_sids = {

        1 = 'Facebook',

        2 = 'API',

        3 = 'Google',

        16 = 'MV',

27 = 'Mopub',

}

正确的见第一宗例子

第四宗 luasql循环的数据直接insert到table,结果不是预期的

local select_sql = "select "..fields.." from wcd where ".. where .. group

print(select_sql)

cur = conn:execute(select_sql)  

row = cur:fetch({},"a")

local re = {}

local total_data = {}

local  fuck ={}

while row do

-- 这是正确的

fuck = {s_id=row['s_id'],show =row['show'],income=row['income'],click=row['click']}

-- 这是错误的

table.insert(re,row)

end

第五宗 不方便判断是否一个值存在于一个数组

第六宗 【或许不算什么罪过,但是使用php习惯了,觉得这样停变态的】定义变量,不要全局变量和局部变量混着来,否则你不根本不知道问题出在哪里

要是觉得不变态,可以帮我理解下下面的代码么,根本不懂什么upvalue啊

local data = 100;

 

local function fun1()

   print(data);

   data = data+50;

 

end

 

data = 200;

 

local data = 300; -- 重新定义一个局部变量

 

local function fun2()

   print(data);

   data = data+50;

end

 

data = 400;

--调用

fun1(); -- 200

fun2(); -- 400

fun1(); -- 250

第七宗 table pairs输出,不按照预定顺序,是不是感觉很恶心啊。

local all_mid_8 = {

['147'] = '147加速',

['148'] = '148页',

['149'] = '149成页',

['118'] = '118屏保',

['153'] = '153功能卡片',

['154'] = '154一键',

}

for mid,mid_name in pairs(all_mid_8) do

print(mid..'==='..mid_name)

end

lua lua

1、ngx.get_phase

Syntaxstr=ngx.get_phase()

Context init_by_lua*, init_worker_by_lua*, ssl_certificate_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*

指令功能:返回当前运行的阶段名字。

init上下文为init_by_luainit_by_lua_file

init_worker上下文为init_worker_by_luainit_worker_by_lua_file

ssl_cert上下文为ssl_certificate_by_lua_block  ssl_certificate_by_lua_file

set上下文为 set_by_lua set_by_lua_file

rewrite上下文为rewrite_by_lua  rewrite_by_lua_file

balancer上下文为balancer_by_lua_block balancer_by_lua_file

access上下文为access_by_lua  access_by_lua_file

content上下文为content_by_lua content_by_lua_file

header_filter上下文为body_filter_by_lua body_filter_by_lua_file

body_filter上下文为log_by_lualog_by_lua_file

log上下文为log_by_lua log_by_lua_file

timer上下文为使用ngx.timer的回调函数;

 

2、lua_package_path

syntaxlua_package_path app/lib/?.lua;app/etc/?.lua;

default:编译时的lua_path

contexthttp

examplelua_package_path "$prefix/app/lib/?.lua;$prefix/app/etc/?.lua;$prefix/app/src/?.lua;;";

指令功能:指明lua库的位置,一般是.lua,在nginx配置里可以直接调用,而不用指定目录。


3、lua_package_cpath

syntaxlua_package_path app/lib/?.so;app/etc/?.so;

default:编译时的lua_cpath

contexthttp

examplelua_package_cpath "$prefix/app/lib/?.so;$prefix/../luajit/lib/lua/5.1/?.so;;";

指令功能:指明lua C库的位置,一般是.so,在nginx配置里可以直接调用,而不用指定目录。


4、lua_max_running_timers

Syntaxlua_max_running_timers <count>

Defaultlua_max_running_timers 256

Contexthttp

Examplelua_max_running_timers 512;

指令功能:设置running timers(回调函数还在运行的timer)的最大值。


5、lua_max_pending_timers

Syntaxlua_max_pending_timers <count>

Defaultlua_max_pending_timers 1024

Contexthttp

Examplelua_max_running_timers 512;

指令功能:设置pending timers(还未过期的timer)的最大值。


6、lua_check_client_abort

syntaxlua_check_client_abort on|off;

default:  off

contexthttp/server/location/location-if

examplelua_check_client_abort on

指令功能:控制是否检查premature client connection abortion,如果打开该选项,当client过早关闭连接时,会清除所有的lualight threads”。


7、lua_socket_log_errors

Syntaxlua_socket_log_errors on|off

Defaultlua_socket_log_errors on

Contexthttp/server/location

Examplelua_socket_log_errors off;

指令功能:在发生TCPUDP cosocket错误时,该指令可以切换错误的日志记录方式,如果已经有合适的处理方式,该指令相当于off,否则就会记录到error log(比较消耗性能)。


8、lua_http10_buffering

Syntaxlua_http10_buffering on|off

Defaultlua_http10_buffering on

Contexthttp/server/location/location-if

Examplelua_http10_buffering off;

指令功能:当请求是HTTP1.0或更老版本时,该指令用于enable/disable 自动的响应缓冲,当响应body特别大时,建议调成off,以免内存消耗过多。


9、lua_shared_dict

syntaxlua_shared_dict <name> <size>

defaultno

contexthttp

examplelua_shared_dict dogs 10m;

指令功能:定义共享内存及大小。

nginx+lua+redis三国演义

今天看到redis2_query  redis2_pass,然后网上一看,原来又是nginx的扩展。

以下copy 网路,自己还没有真正搞过。

redis2-nginx-module 是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能。

安装lua
# apt-get install lua5.1
# apt-get install liblua5.1-dev
# apt-get install liblua5.1-socket2
安装nginx
# apt-get install git-core
# git clone https://github.com/simpl/ngx_devel_kit.git
# git clone https://github.com/chaoslawful/lua-nginx-module.git
# git clone https://github.com/agentzh/redis2-nginx-module.git
# git clone https://github.com/agentzh/set-misc-nginx-module.git
# git clone https://github.com/agentzh/echo-nginx-module.git
# git clone https://github.com/catap/ngx_http_upstream_keepalive.git
# apt-get install libpcre3 libpcre3-dev libltdl-dev libssl-dev libjpeg62 libjpeg62-dev libpng12-0
 libpng12-dev 
libxml2-dev libcurl4-openssl-dev libmcrypt-dev autoconf 
libxslt1-dev libgd2-noxpm-dev libgeoip-dev libperl-dev -y
# wget http://nginx.org/download/nginx-1.0.8.tar.gz
# tar zxvf nginx-1.0.8.tar.gz
# cd nginx-1.0.8
# ./configure --prefix=/usr/local/nginx --with-debug --with-http_addition_module \
--with-http_dav_module --with-http_flv_module --with-http_geoip_module \
--with-http_gzip_static_module --with-http_image_filter_module --with-http_perl_module \
--with-http_random_index_module --with-http_realip_module --with-http_secure_link_module \
--with-http_stub_status_module --with-http_ssl_module --with-http_sub_module \
--with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl \
--with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module \
--add-module=../ngx_devel_kit \
--add-module=../echo-nginx-module \
--add-module=../lua-nginx-module \
--add-module=../redis2-nginx-module \
--add-module=../ngx_http_upstream_keepalive \
--add-module=../set-misc-nginx-module
# make
# make install
安装lua-redis-parser


# git clone https://github.com/agentzh/lua-redis-parser.git
# export LUA_INCLUDE_DIR=/usr/include/lua5.1
# make CC=gcc
# make install CC=gcc

安装json
# wget http://files.luaforge.net/releases/json/json/0.9.50/json4lua-0.9.50.zip
# unzip json4lua-0.9.50.zip
# cp json4lua-0.9.50/json/json.lua /usr/share/lua/5.1/
安装redis-lua

# git clone https://github.com/nrk/redis-lua.git
# cp redis-lua/src/redis.lua /usr/share/lua/5.1/

»»阅读全文

lua html模板(win)

set $template_location "/html";   
	set $template_root "D:/openresty/html/html";
	

	
	location /html_html {  
		default_type 'text/html';  
		content_by_lua_file "html/html/test_template_1.lua";   
	}  
	
	location /html_html2 {  
		default_type 'text/html';  
		content_by_lua_file "html/html/test_template_2.lua";   
	} 
	
		
	location /html_html3 {  
		default_type 'text/html';  
		charset utf-8;
		#ngx.header['Content-Type']="text/html;charset=UTF-8"
		content_by_lua_file "html/html/test_template_3.lua";   
	} 

»»阅读全文

lua中 点(.)和冒号(:)的区别

local class = {}  
  
function class:new(x, y)  
    local mt = {}  
    mt.x = x   
    mt.y = y   
    self.__index = self  
    setmetatable(mt, self)  
    return mt   
end  
  
-- 等效 function class.printf(self)  
function class:printf()  
    print(self.x ,self.y)  
end  
  
different = class:new(1,2)  
  
-- different.printf()   这个不对  函数内找不到self  
-- different:printf()   --正确  默认形参是self  
different.printf(different)  --正确   没有默认形参 需手动添加在函数中需要用到的参数  
  
--规则: 在使用的时候 属性用点 函数用冒号可以避免混乱

lua api

本来这个功能使用php实现了,但是想尝试下lua,暂时在win测试的,因为md5的原因,就终止了。代码先放上来,以后有时间在改。

location ~ /api {
		content_by_lua_file html/lua.lua;
}
curl的时候 一定用双引号 开始用单引号 折腾了半天 奶奶的。
curl  -d "{\"news\":{\"id\":\"175e45e26c5d10a78dd42e613ba74c57\",\"title\":\"Put a ring on it: 
Mariko Mori to hang symbol of unity above Rio waterfall ahead of OlympicGames\",\"timestamp\":\"\",
\"news_entry_id\":\"5f89783e\",\"category\":\"others\",
\"url\":\"http://theartnewspaper.com/news/news/put-a-ring-on-it-mariko-mori-to-hang-symbol-
of-unity-above-rio-waterfall-ahead-of-olympic-games/\"},
\"from\":{\"avatar\":\"http://pbs.twimg.com/profile_images/633675712319242240/9Vri2Jh7_bigger.jpg\",
\"screen_name\":\"TheArtNewspaper\",\"openid\":\"38681183\"},
\"to\":[\"cd21b5bac2317d41c32ae2713836b2824455bafc\"],
\"time\":146414554125,\"key\":\"754942a90ecd1227a2ace4c32c7d36af11\"}"  http://localhost/api

»»阅读全文