前段时间,老王推荐了一个伪同步的代码,async,可以到github上找到代码:https://github.com/hugozhu/async_php/,其中,有一个lua的目录,是用来为nginx提供插件以担当这个同步功能的一些玩意。
于是冲到nginx上看了一下,NND,没这玩意嘛 .
再一瞅github上,原来还写着:
ngx_lua module - http://openresty.org latest stable release
我晕,那openresty是什么玩意呢?去官方看了看,一大堆英文,但是左侧的支付宝捐赠让我怀疑这应该是个国人的作品。于是找啊找,找了一个中文介绍:
官网: http://openresty.org/
虽然是中国人做的,但没几个汉字.....
我用Nginx,是这样一个过程:
1. 系统rpm中的nginx,能让其跑起来
2. 玩配置文件
3. 玩编译选项
4. 写插件,集成第三方插件
OpenResty , 是淘宝一位大牛(agentzh)集成的包含N多好插件的Nginx捆绑源码包,这位仁兄自称Nginx最活跃的第三方模块开发人员哦
下面,当然要列一下到底集成了什么模块:
LuaJIT -- 极速版Lua实现
ArrayVarNginxModule -- 数组类型的Nginx变量
AuthRequestNginxModule -- 鉴权,想象一下以C代码的速度判断一个请求是否合法,是不是很有快感呢?!
DrizzleNginxModule -- Nginx-MySQL桥,非阻塞的哦,我又爱又恨的一个模块,值得注意的是,其响应是RDS流
EchoNginxModule -- 以非常直观的方式在Nginx配置文件中编写简单的处理逻辑,源码包含大量注释,绝对是入门好例子!!
EncryptedSessionNginxModule -- 加密会话
FormInputNginxModule -- 解析post请求中的参数,这下子,简单请求根本不需要PHP/Java来处理啦
HeadersMoreNginxModule -- Nginx默认的header模块只能添加或忽略,这个给你CRUD全套的!!
IconvNginxModule -- 编码转换,不多说,也不懂
StandardLuaInterpreter -- 与Lua官方实现所匹配,一般用不上,因为我们用LuaJIT!!
MemcNginxModule -- 与Memcached的绝配,谁用谁知道!! 与upstram_keepalive一起用,你能更High!!
Nginx
NginxDevelKit -- N多第三方插件都依赖的东西,不知道为啥
LuaCjsonLibrary -- Lua版的Json处理库实在太慢,这个才叫速度!!
LuaNginxModule -- 我的最爱,一般逻辑,完全没必要用Java/PHP啦
LuaRdsParserLibrary -- 在Lua中直接处理RDS流,速度杠杠的!
LuaRedisParserLibrary -- 在Lua中处理Redia模块的响应,暂时我还没用上
PostgresNginxModule -- Nginx-Postgres桥,输出的也是RDS流
RdsCsvNginxModule -- RDS流转CVS格式,不知道能干啥,报表?
RdsJsonNginxModule -- RDS流转JSON字符串,之前经常用这个
Redis2NginxModule -- Nginx-Redis2桥
SetMiscNginxModule -- 提供很多很实用的方法,例如base64编解码,URL编解码,SQL防注入等等
SrcacheNginxModule -- 缓存模块,据说跟Memc模块一起用比较爽
UpstreamKeepaliveNginxModule -- 与Memc模块的标配,号称性能提升几倍呢
XssNginxModule -- 防跨站攻击的
OpenResty的最大的好处是帮你弄清楚各个模块的编译顺序,别小看,学问大大的呢
当初没有这东西,单单弄清楚模块间的编译顺序就耗费不少时间
来吧,试试这个国产的精品!!
-------EOF--------
以上这段内容来自:http://wendal.net/338.html
值得看看哦。可以尝试用lua写插件
这篇文章很有意思,所以我转贴了一下:
XML/HTML代码
- 企业中,产品研发是一项综合性的工作,需要多个部门参与。但往往会出现各种各样的问题,如部门协作困难、全局监控难等,这困扰着大多数的企业。
-
- 本文是一个真实的案例:
-
- 菲利普(主 席):我们工厂中有10%的员工没有充分利用,要么我们开始处理更多的积压工作,要么进行裁员。我宁愿每个人都很忙。我们该如何做?
-
- 李(业务部经理):公司政策规定,我们要处理3个月内的积压工作,如果改成4个月,我们将有大量的工作。
-
- 菲利普:好。现在,我们该如何实现?
-
- 李:我不是很确定。我认为,我们需要更改传统的软件设置。
-
- 大卫(IT总监):没问题。可能只需要更改核心程序中的一行代码。(填写一个清单,提交给IT部门)。
-
- 朱迪(IT管理员):我正分派这个单号为#129281的需求。但是这需要目前的商务项目做完,并由主任签字。
-
- 大卫:这是菲利普交代的,我们不立刻做的话,就必须裁员。
-
- 朱迪:OK,我会马上填写,并标记为紧急任务。
-
- 2 天后
-
- 大卫:#129281目前状态是什么?
-
- 朱迪:它是开发人员任务队列中的紧急任务,前面还有14个紧急的Bug报告需要处理。
-
- 大卫:忘记任务队列。将它标记为紧急,立即发给艾德(程序员)。
-
- 1 小时后
-
- 艾德(程序员):在模块ORP572的第1252行中,我将写死的变量MonthsOfBacklog(积压月份)值从“3”改成了“4”。然后,运行了2批测试用例,成功进行单元测试。业务工作量增加了10%,这是预期数据。我正准备提交代码审查,并交给Homer进行用户验收测试。
-
- 雪莉(代码审查):这违反了公司的政策,你必须在参数文件中做个记录。此外,还有2个旧的调试命令,1个无指定的变量警告消息和1个写死的Employee ID,必须在这个模块移交到产品之前进行修复。
-
- 艾德:!~@#$%^&*(脏话)。
-
- 雪莉:这些bug很可能是真的。一旦你被指派ORP572模块,你就需要对已经存在的、违反新公司政策的错误进行修复。我不能提交。
-
- 2 小时后
-
- 艾德:OK,完成。我正要重新提交代码审查。
-
- 朱莉(IT测试):Homer不能进行用户验收测试,因为Fred正在运行一个本月底财务要用的约束测试。使用Marge代替。
-
- 艾德:我没有访问Marge的权限。
-
- 朱莉:联系IT安全部门的乔,他会给你开权限的。
-
- 2 小时后
-
- 乔(IT安全):没有大卫的签名,我不能给你开Marge权限。他出差了,得等到周一。
-
- 艾德:我不这么认为。菲利普希望马上实施,让他来授予权限。
-
- 雪莉:你的新的参数记录“MonthsOfDemand”需要起一个更好的名字。离岸程序员(位于其他国家的开发部门)不明白这意味着什么。此外,它应该有一个变化核查轨迹。
-
- 艾德:命名有什么规定?
-
- 雪莉:忘了写在什么地方了。离岸团队是3月中下旬更新的wiki,能肯定的是,所有新的参数记录必须满足新的命名要求,并保持核查轨迹。
-
- 1 天后
-
- 艾德:我将参数记录中的“MonthsOfDemand”重命名为“SelectedMonthsOfBacklogDemand”,并添加模块PAR634以保持纪录和核查轨迹。我已经提交到代码审查。
-
- 托尼(IT测试):我看到Marge中有#129281任务,但我没有收到测试计划。
-
- 艾德:按照老方式运行就行,注意WorkOrdersHours报告中总量的增加。
-
- 托尼:这就是你的测试计划?这会影响到企业的其他方面,我必须有用户选择的测试用例、预期结果、测试运行记录以及用户签收。
-
- 2 天后
-
- 菲利普:大卫,告诉托尼将艾德的程序立即提交到产品部门。
-
- 大卫:是的,先生。
-
- 本次任务总结:
-
- 总时间:6天
- 关键任务代码更改行数:1行
- 关键任务代码更改字节数:1字节
当然,你要了解更多的东西,你还可以看它的评论:http://www.iteye.com/news/25109
关注一下这玩意是因为在命令行下写程序的时候,发现不能够自我守护。都只能用shell来再开一个进程监控。本来想做三角监控的,但想想,只是为了一个小程序,我得写三个程序来自我守护,真没劲啊。
所以,找到pcntl_fock函数的时候很激动,其实在很久以前看过,但是没关注过,毕竟很多时间跑命令行程序的时候,一下子就跑完了,真正跑了不退出的程序,真的很少用。
http://rainbird.blog.51cto.com/211214/277861/
- <?php
- $pid = pcntl_fork();
- if($pid == -1){
- //创建失败咱就退出呗,没啥好说的
- die('could not fork');
- }
- else{
- if($pid){
- //从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值
- exit(0);
- }
- else{
- //从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值
- exit(0);
- }
- }
- ?>
所以,以下内容就来自于上述代码中有涉及到的博客:
XML/HTML代码
- 这样一改好理解多了,如果你父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait.
- 函数的用法是整明白了,在实际的工作中有什么用处呢?
- 1.后台程序
- 命令行程序好写,服务程序也好写,笔者觉得这服务程序最难写.想想原来想在windows下写个服务啥的,又是要注册服务又是要这样那样的老费劲了.现在专职管理linux想让个命令行程序在后台运行,直接在命令后面加个&就搞定了.但是这样总觉得土.有了pcntl_fork突然发现世界是那么的美好.当主进程成功创建子进程并获得子进程的id以后,自己在临死前还不忘说一句:"我已成功运行,我的id是:xxxx(子进程的id)",完了还给系统返回个0(正常退出),哈哈,死都死的那么有尊严.
- 前面说的是程序常驻内存的情况,当然了这时候要注意内存的释放以及向日志文件打印信息,而不是往屏幕上(一打印信息程序就退出的哟).还有一种情况是:程序被其它脚本调用,其它脚本只关心程序是不是正常运行,如果程序要运行很长时间才能运行完的话,最好不让脚本等待.这样的话pcntl_fork又派上用场了:)
- 2.延时处理.
- 有的时候,我们程序退出的时候要清理自身产生的东西,比如说要删除自己(当然了linux下面是可以删除正在运行的文件的,只是举个例子),这个时候就可以另起动一个进程,然后自己结束了,把事情交给另一个进程来做.当我们写服务程序的时候,我们肯定是写日志文件记录程序的运行情况(要不谁知道程序是不是在那睡大觉的:0).程序正常退出的时候我们可以写一条日志说程序退出了,但是当程序收到linux下伟大的kill -9的时候,怎么记录自己的退出行为呢?额.....这个和php的进程信号有关好像和这个没多大关系.
- 另一种情况:一个完善的程序一般都支持start,stop,restart这样的参数.start好说,stop也好说,既然start和stop都好说了,这个restart就先stop然后再start就可以了啊.额...好像又和pcntl_fork没多大关系,当你收到重启的信号总不能还是kill然后再start吧,是不是太黄太暴力了?还是温柔一点,让当前进程退出,让另外的进程再把它拉起来吧.在windows下想实现这一点似乎很困难呢,比如程序更新的时候,一般都是单写更新程序,或者程序退出的时候另起动一个批处理启动自己:)
- 3.不死进程
- 其实就是传说中的双进程了.早些年的时候万象网管为了达到不被恶意结束的目的用的就是这招了.虽然咱不用担心程序被人恶意停止,但是也保不齐主程序因为任务太重抗不住自己先挂了(这种情况也不是不会发生).所以......
- 说了这么多,只是对写程序的一些思考,对一个函数用法的延伸.我想到了这么多,你呢?
不知道是否能够做到这个地步,但是先关注一下,只是现在加班频繁,都不知道有没有时间来折腾它。套用锅巴说的一句:忙的象狗的人往 往都是穷鬼
有一个网站叫printerest,这个大家都知道,现在,又有了一个新的网站,网址是 http://www.snatchly.com/,不建议点击哦
风格是一样的,都是瀑布流的风格。只是这个网站的点击率超高,于是乎,投资界就写了一篇文章介绍了它一下:
http://news.pedaily.cn/201205/20120517326726.shtml
- Pinterest很流行,而有一个产业从来不会放过任何新的技术和模式,那就是色情产业。最近一家采用Pinterest风格的成人网站正式上线,以其鲜丽夺目的图片墙与无限滚动的瀑布流带给了用户最强的视觉冲击,获得了广泛的关注。
-
- 像Pinterest一样,这家网站允许用户将自己在互联网上发现的各种色情内容(包括图片和视频)添加到网站上,并根据不同的风格进行整理和分享。
也正是这篇文章让我明白,原来,色情业居然是技术的前沿阵地,居然是VHS标准等的制定参考对象。投资界中这样描述:
XML/HTML代码
- 实际上,这并不是色情产业第一次引入成功的互联网模式。回顾历史,我们可以看到色情产业在诸多方面都推动着互联网的进步。
-
- 在20世纪80年代的VHS与Betamax录像带标准争夺战中,正是因为色情行业对VHS格式的支持,使得质量更高的Betamax格式反而落败。同样的事情也发生在RMVB与Flash流媒体标准、蓝光与HD-DVD光盘格式的大战中,色情行业的支持直接促成了标准的诞生。
-
- 在另一角度,在线支付成为大众接受的支付方式仅仅是几年之前,但是有一个行业,早在20世纪90年代就已经对其进行了成功的实践。是的,这也是色情业,1999年的在线成人内容消费额高达13亿美元,占当年在线消费总额的8%,大大高于在线购书和订购机票的消费额。
-
- 广泛的流媒体播放技术直到YouTube开始才被在线媒体广泛应用,但成人网站也早早就已经开始采用无需任何附加插件的早期流媒体播放技术。正如畅销书作家 Lewis Perdue 所说,“28.8K 猫时代的程序员们为了让付费用户看上性爱画面而对在线播放软件进行的极致优化,是今日CNN得以通过网络快速传播新闻视频的技术基础”。成人网站用户强烈的在线流媒体播放需求推动了流媒体播放技术的快速进步。
当然,让我震精的还有:
XML/HTML代码
- 普通的网站架构是难以承受这样庞大的数据需求的,成人网站们的解决方案包括成立自己的数据中心,租用亚马逊AWS、微软Azure这样的大型云计算资源,采用更高效的网站架构和数据库技术等。他们采用这些方案其实并不是源于其对新技术的好奇,而是为了满足用户不断增长的需求。
果然这些解决方案都是走在了世界前沿啊。要向他们学习。
一个句子的迁移,一个粗心:
原mysql代码是:select date_format(from_unixtime(xxx),'%Y-%M') as xxxxx from table group by xxxxx
sql server转换后:
select (select dateadd(ss,xxx,'1970-01-01 08:00:00')) as xxxxx from table group by xxxxx
因为sql server不支持将as 后的内容做聚集,只能:
select dateadd(ss,xxx,'1970-01-01 08:00:00') as xxxxx from table group by (select dateadd(ss,xxx,'1970-01-01 08:00:00'))
但又报错,说是group by 不能使用子查询。
仔细想了想,(select dateadd(ss,xxx,'1970-01-01 08:00:00')) as xxxxx,这个select用来干嘛 ?如果是在查询分析器里,当然是要用select,因为要输出嘛,但是在sql语句中。。。
不需要啊。
记录一下。