摘要:一個(gè)小小的需求,可能會(huì)遇到很多問(wèn)題,但是搜索相關(guān)的關(guān)鍵字,就能快速實(shí)現(xiàn)出來(lái),完成一個(gè)小目標(biāo),事半功倍。下面開始一個(gè)小需求一個(gè)地址有兩套頁(yè)面,需要在后端根據(jù)瀏覽器的來(lái)顯示不同的頁(yè)面。而的結(jié)果在個(gè)并發(fā)的時(shí)候,失敗的請(qǐng)求數(shù)依舊是。
一個(gè)小需求之前做一次分享 如何快速學(xué)習(xí)一門新的語(yǔ)言的直播分享 但是那是以實(shí)現(xiàn)一個(gè)后端框架的角度來(lái)講的,道理想通,我們要以實(shí)際的需求出發(fā)。一個(gè)小小的需求,可能會(huì)遇到很多問(wèn)題,但是搜索相關(guān)的關(guān)鍵字,就能快速實(shí)現(xiàn)出來(lái),完成一個(gè)小目標(biāo),事半功倍。
死記硬背手冊(cè),太枯燥了,反正我是看不下去,不如直接來(lái)個(gè)小項(xiàng)目。下面開始:
pc、mobile 一個(gè)地址有兩套頁(yè)面,需要在后端根據(jù)瀏覽器的 user_agent 來(lái)顯示不同的頁(yè)面。
通過(guò) php 來(lái)做,當(dāng)然可以,但是活動(dòng)頁(yè)面訪問(wèn)量一般都比較大,想優(yōu)化些,所以想嘗試下 lua。
可以直接上 openresty,不過(guò)有時(shí)候就是想折騰。
安裝的步驟 https://mengkang.net/994.html (如果你想實(shí)踐的話再看吧)
-- 判斷是否是手機(jī)瀏覽器 function isMobile(userAgent) -- 99% 前三個(gè)都能匹配上吧 local mobile = { "phone", "android", "mobile", "itouch", "ipod", "symbian", "htc", "palmos", "blackberry", "opera mini", "windows ce", "nokia", "fennec", "hiptop", "kindle", "mot", "webos", "samsung", "sonyericsson", "wap", "avantgo", "eudoraweb", "minimo", "netfront", "teleca" } userAgent = string.lower(userAgent) for i, v in ipairs(mobile) do if string.match(userAgent, v) then return true end end return false end -- 根據(jù)id + 瀏覽器類型展示活動(dòng)頁(yè)面 function showPromotionHtml(id, isMobile) local path = "/data/www/mengkang/demo/promotion/" local filename if isMobile then path = path .. "mobile" else path = path .. "pc" end filename = path .. "/" .. id .. ".html" if file_exists(filename) then local file = io.open(filename,"r") io.input(file) print(io.read("*a")) io.close(file) else print("文件不存在: " .. string.gsub(filename, "/data/www/mengkang/demo", "")) end end -- 判斷文件是否存在 function file_exists(path) local file = io.open(path, "rb") if file then file:close() end return file ~= nil end local id = 1 local userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" showPromotionHtml(id, isMobile(userAgent))小結(jié)
作為一個(gè) lua 菜鳥,通過(guò)這個(gè)小需求我查了哪些資料
變量的定義
函數(shù)的寫法
循環(huán)的了解
判斷邏輯的寫法
注釋的寫法
文件 i/o
字符串拼接 ..
字符串查找 string.match
字符串轉(zhuǎn)小寫 string.lower
-- 判斷是否是手機(jī)瀏覽器 function isMobile(userAgent) -- 99% 前三個(gè)都能匹配上吧 local mobile = { "phone", "android", "mobile", "itouch", "ipod", "symbian", "htc", "palmos", "blackberry", "opera mini", "windows ce", "nokia", "fennec", "hiptop", "kindle", "mot", "webos", "samsung", "sonyericsson", "wap", "avantgo", "eudoraweb", "minimo", "netfront", "teleca" } userAgent = string.lower(userAgent) for i, v in ipairs(mobile) do if string.match(userAgent, v) then return true end end return false end -- 根據(jù)id + 瀏覽器類型展示活動(dòng)頁(yè)面 function showPromotionHtml(id, isMobile) local path = "/data/www/mengkang/demo/promotion/" local filename if isMobile then path = path .. "mobile" else path = path .. "pc" end filename = path .. "/" .. id .. ".html" if file_exists(filename) then local file = io.open(filename,"r") io.input(file) ngx.say(io.read("*a")) io.close(file) else ngx.say("file not found : " .. string.gsub(filename, "/data/www/mengkang/demo", "")) end end -- 判斷文件是否存在 function file_exists(path) local file = io.open(path, "rb") if file then file:close() end return file ~= nil end local id = ngx.var.id local userAgent = ngx.req.get_headers().user_agent showPromotionHtml(id, isMobile(userAgent))nginx 配置
server { listen 80; server_name mengkang.net location ~ /promotion/(d+) { set $id $1; default_type "text/html"; content_by_lua_file /data/www/lua/1.lua; } }演示地址
https://mengkang.net/promotion/1
https://mengkang.net/promotio...
切換 user_agent 即可看到,不同的 pc 和 mobile 兩個(gè)版本的頁(yè)面
rewrite ^/promotion2/(.*)$ /demo/promotion.php last;php 代碼
也就是說(shuō)訪問(wèn) http://mengkang.net/promotion/1 和 http://mengkang.net/promotion2/1 是一樣的結(jié)果
配置說(shuō)明雙核4G
nginx 配置一致
php 版本:7.0.11
php-fpm 配置:pm = dynamic pm.max_children = 10 pm.start_servers = 4 pm.min_spare_servers = 4 pm.max_spare_servers = 10php 壓測(cè)結(jié)果ab -n 1000 -c 100 http://mengkang.net/promotion2/1 Requests per second: 3105.21 [#/sec] (mean) Time per request: 32.204 [ms] (mean) ab -n 4000 -c 400 http://mengkang.net/promotion2/1 Requests per second: 3361.87 [#/sec] (mean) Time per request: 118.981 [ms] (mean) Complete requests: 4000 Failed requests: 259 ab -n 8000 -c 800 http://mengkang.net/promotion2/1 Requests per second: 3358.20 [#/sec] (mean) Time per request: 238.223 [ms] (mean) Complete requests: 8000 Failed requests: 654 ab -n 10000 -c 1000 http://mengkang.net/promotion2/1 Requests per second: 3275.30 [#/sec] (mean) Time per request: 305.315 [ms] (mean) Complete requests: 10000 Failed requests: 9150lua 壓測(cè)結(jié)果ab -n 1000 -c 100 http://mengkang.net/promotion/1 Requests per second: 6014.89 [#/sec] (mean) Time per request: 16.625 [ms] (mean) ab -n 4000 -c 400 http://mengkang.net/promotion/1 Complete requests: 4000 Failed requests: 0 Requests per second: 6190.57 [#/sec] (mean) Time per request: 64.614 [ms] (mean) ab -n 8000 -c 800 http://mengkang.net/promotion/1 Complete requests: 8000 Failed requests: 0 Requests per second: 7046.66 [#/sec] (mean) Time per request: 113.529 [ms] (mean ab -n 10000 -c 1000 http://mengkang.net/promotion/1 Complete requests: 10000 Failed requests: 0 Requests per second: 5670.38 [#/sec] (mean) Time per request: 176.355 [ms] (mean)對(duì)比可見PHP qps 在 3000左右,nginx_lua qps 在 7000 左右。qps 提升了1倍多,而且響應(yīng)時(shí)間更短,而且 php 在 400 個(gè)并發(fā)的時(shí)候開始出現(xiàn)比較多的失敗請(qǐng)求,吞吐率開始下降。而 lua 的結(jié)果在 1000 個(gè)并發(fā)的時(shí)候,失敗的請(qǐng)求數(shù)依舊是0。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39658.html
摘要:一個(gè)小小的需求,可能會(huì)遇到很多問(wèn)題,但是搜索相關(guān)的關(guān)鍵字,就能快速實(shí)現(xiàn)出來(lái),完成一個(gè)小目標(biāo),事半功倍。下面開始一個(gè)小需求一個(gè)地址有兩套頁(yè)面,需要在后端根據(jù)瀏覽器的來(lái)顯示不同的頁(yè)面。而的結(jié)果在個(gè)并發(fā)的時(shí)候,失敗的請(qǐng)求數(shù)依舊是。 之前做一次分享 如何快速學(xué)習(xí)一門新的語(yǔ)言的直播分享 但是那是以實(shí)現(xiàn)一個(gè)后端框架的角度來(lái)講的,道理想通,我們要以實(shí)際的需求出發(fā)。一個(gè)小小的需求,可能會(huì)遇到很多問(wèn)題...
摘要:簡(jiǎn)評(píng)新的語(yǔ)言層出不窮,等等。原作者分享了以下幾點(diǎn)先掌握語(yǔ)言,再學(xué)習(xí)框架有些朋友傾向于學(xué)習(xí)框架,比如。比如說(shuō)這段代碼方式實(shí)現(xiàn)一些東西在功能實(shí)現(xiàn)的同時(shí)找到編程語(yǔ)言的樂趣,給編程語(yǔ)言找到具體的應(yīng)用場(chǎng)景。 簡(jiǎn)評(píng):新的語(yǔ)言層出不窮,Dart, Go, Kotlin, Elixir 等等。極光日?qǐng)?bào)曾經(jīng)分享過(guò)一篇文章 —— 不同編程語(yǔ)言的學(xué)習(xí)曲線。挑戰(zhàn)學(xué)習(xí)曲線這事兒可能太難,但有些小技巧能幫助我們快...
摘要:語(yǔ)言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級(jí)大牛和寫成。作者華為云技術(shù)宅基地鏈接谷歌前員工認(rèn)為,比起大家熟悉的,語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替,他已經(jīng)在很多任務(wù)中使用語(yǔ)言替代了。 Go 語(yǔ)言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級(jí)大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫成。由于出身名門,Go 在誕生之初就吸引了大批開發(fā)者的關(guān)注。誕生...
閱讀 2843·2021-09-10 10:50
閱讀 2198·2019-08-29 16:06
閱讀 3204·2019-08-29 11:02
閱讀 1104·2019-08-26 14:04
閱讀 2815·2019-08-26 13:24
閱讀 2310·2019-08-26 12:16
閱讀 556·2019-08-26 10:29
閱讀 3104·2019-08-23 18:33