背景:现在流行nginx,于是安装一个监控可能没有必要,但是机器多可能还是有必要装一个agent之类的,这种小工具一般有个三五台服务器可以用用,大型的还得自己搞一套体系才行。

场景

想查看Nginx的实时状态信息,如哪些请求最频繁、哪些IP访问次数多 ……

例如服务器出现带宽持续很高,就需要看下现在哪些请求的流量大

ngxtop

ngxtop就是用来满足这些实时监控需求的,是个非常小巧实用的工具

ngxtop通过分析nginx的访问日志,使用类似top命令的界面实时展示出来

需要注意的是,ngxtop是查看实时状态信息,就是在执行ngxtop命令之后的统计信息,和top一样,不要理解为是对所有日志内容的统计

基本用法

$ ngxtop

结果形式如下

显示大图


实用案例

查看404状态的请求

$ ngxtop top request_path --filter 'status == 404'

查看响应流量最高的请求

$ ngxtop --order-by 'avg(bytes_sent) * count'

查看访问量最大的IP

$ ngxtop --group-by remote_addr

查看状态为4xx或者5xx的请求,同时显示status和http_referer信息

$ ngxtop -i 'status >= 400' print request status http_referer

查看以某字符串开头的请求

ngxtop --filter 'request_path.startswith("/wp")'

参数说明

-l: 指定日志文件的完整路径,默认情况下会读取nginx.conf里指定的访问日志路径

-f: 日志格式

-t : 更新频率,默认2秒

-g: 根据变量 group by,默认变量是 request_path

-o: 根据变量 order by,默认变量是 count

-h: help,详细的命令参数说明和使用方法,可以用这个参数查看帮助

内置变量

可以对以下内置变量进行操作,例如上面案例中的'status >= 400'

bodybytessend

http_referer

httpuseragent

remote_addr

remote_user

request

status

time_local

安装

ngxtop的安装需要依赖库 pip

然后使用pip安装 ngxtop

$ sudo pip install ngxtop
第一种方法:Command+M只能最小化一个窗口。
Macr如何快捷切换桌面 Mac切换桌面快捷键操作教程
第二种方法:把程序快速隐藏,切换到桌面,按F11,如下图:
Macr如何快捷切换桌面 Mac切换桌面快捷键操作教程
第三种方法:换桌面1 桌面2 可以用 command +1 或者 2来切换,实现窗口的切换。
Macr如何快捷切换桌面 Mac切换桌面快捷键操作教程
第四种方法:Fn+f11;苹果键+f3;触控板五个手指扩张,实现所有窗口最小化。

来自:http://www.pc841.com/article/20150311-43140.html
背景:生成一个唯一性的uuid有一个好处,那就是可以用它标识一个唯一的事物,或一次接口请求只能一次,统一了格式。
用redis队列吧
每次要唯一值都从redis里面拿
uniqid() 性能狠low
你这么做可以满足自己的需求
当前 机器IP+ pid+microtime+rand
pid是当前进程号





*************************************************************************************

也可以直接用sql语句生成如:
直接在insert语句中插入UUID作主键的用法(简便):
insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);

************************************************************************************

php生成uuid 来表示唯一码
uuid是什么?guid是什么?php如何生成uuid?(google 搜索相关内容时使用uuid + mysql得到的结果较uuid+php要多些)

这里有一篇关于UUID的说明 蛮详细

http://mlxia.javaeye.com/blog/279059

以下部分内容为转载:

我唯一还算熟悉的数据库就 算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的 KeyGenerator,也可能是我们下面要说的UUID。

据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:

mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+


现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。

优点:

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

缺点:

比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。

下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨。至于说使用UUID后,URL 显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词, 仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下 面这个形式的:/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现 URL是/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订 单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。

效率?

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专门的 UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键, 一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试,另外,UUID做主键的效率和UUID本身的算法 实现也有很大关系。

我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。

至于在MySQL上使用UUID(用char(36)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!

如何生成UUID?下面这种方法生成的貌似不是UUID,因为MD5实际上是可能存在重复值的(参考http://www.phpx.com/happy/archiver/tid-56636.html),况且使用随机更不能避免存在重复.所以应直接使用mysql中的uuid函数生成

de> function uuid($prefix = '')

     {

     $chars = md5(uniqid(mt_rand(), true));

     $uuid     = substr($chars,0,8) . '-';

     $uuid .= substr($chars,8,4) . '-';

     $uuid .= substr($chars,12,4) . '-';

     $uuid .= substr($chars,16,4) . '-';

     $uuid .= substr($chars,20,12);

     return $prefix . $uuid;

     } de>

在mysql中插入uuid使用mysql的uuid()函数

INSERT INTO Table(id,..) VALUES( UUID(), ...)

当然也可以用 SELECT UUID() 先得到一个uuid值再插入进去

题外:

可能相比较使用整型做主键,效率稍差,
另外一个问题是可能导致URL太长,比如显示某个id下的分类时
通常这样category.php?cid=2 但是现在可能是category.php?uuid=a93f16c5-9634-102c-824f-3ea0651c5b77
是否能更改为整型做主键

摘自 :http://blog.csdn.net/china_skag/article/details/7297957
1.DRY原则:不要重复(Don’t repeat yourself)--程序设计中一个最根本的原则就是要避免重复。许多编程结构(比如循环、函数、类等)的存在就是为了避免重复。

2.抽象原则:“每个在程序中有意义的功能片段应该只在源代码的一处地方实现”。

3.KISS(Keep it simple, stupid!)原则:简单性(避免复杂性)应该永远当作是一个重要的目标。写简单的代码,不但花费的时间少,错误少,而且修改起来也容易。

4.避免创建YAGNI(You aren’t going to need it)原则:只有当你需要的时候才去添加额外的功能,不需要就不要画蛇添足。

5.方法要最简单,效果要一样好:在编程时,我们需要问问自己“有没有最简单的完成任务的途径”,这有助于我们保持一直行走在简约设计的道路上。

6.不要让我思考:这实际上是由Steve Krug写的一本书的书名。关键要点是,代码应该尽可能地易于阅读和理解。如果阅读人需要大量的思考才能理解代码,那么或许这代码还需要被简化。

7.开/闭原则:软件实体(类,模块,函数等)在扩展时应该开放,在修改时应该关闭。换句话说,你写的类大家可以扩展,但不能修改。

8.为维护者写代码:值得写的代码要保证将来一定值得维护。未来的你由于经历的代码太多,也许再回过头来看这些代码的时候,也和其他人一样,已经成为了一个完全的陌生人。请记住,“写代码的时候,就假设将来要维护的人是个知道你住在哪里的暴力型精神病患者吧”!

9.最小惊讶原则:最小惊讶原则通常引用于用户界面方面,但这一原则也适用于编写代码。代码应该尽可能地不要让阅读者惊讶。遵守标准约定,注释说什么代码就做什么,命名是什么意思代码就是什么意思,尽可能地避免惊讶导致的潜在的负面影响。

10.单一职责原则:代码(如类或函数)的组成部分执行的应该是一个单一的明确的任务。

11.最小化耦合原则:代码的任何部分(代码块,函数,类等)都应该尽量减少对其他代码的依赖。这可以通过尽量不要使用共享变量来实现。“低耦合常常是计算机系统构造良好和设计良好的标志,并且当和高内聚力相结合的话,还可以大大支持可读性和可维护性的整体目标。”

12.最大化内聚原则:具有相似功能的代码应该放在同一个组件内。

13.隐藏实现细节原则:隐藏实现细节,允许在改变代码组件的实现的同时,最低限度地减少对使用该组件的其他模块的影响。

14.得墨忒耳定律:代码组件应该只和它们的直接关系(如继承的类,包含的对象,通过参数传递的对象等)沟通。

15.避免过早优化原则:除非代码开始工作,否则甚至就不要有优化的念头。只有当你必须要优化的时候,才能借助实战数据的帮助。“我们一定要有大局观,过早的优化是万恶之源”--Donald Knuth。

16.重用代码才是好代码:这和任何其他法则一样精辟。重用代码可以提高代码的可靠性,并减少开发时间。

17.关注点分离原则:不同的功能区域应该由明显的重叠最小的代码模块进行管理。

18.拥抱变化原则:这是Kent Beck写的一本书的副标题,也被认为是极端编程和通用敏捷方法的原则。许多其他原则都基于这个理念:你应该期待和欢迎变化。事实上,很多古老的软件工程法则,例如最小化耦合原则,就是和让代码变得更容易改变是直接相关的。无论你是不是一个极端编程的实践者,这种写代码的方法真的很有意义。
曾国藩,身上的标签很多,“千古完人”“晚清中兴第一名臣”“曾剃头”“理学大家”。

       对于这样近现代史上不得不谈的人物,在读完这本之后,却只想起了曾国藩快去世前和自己的仆人康福之间的谈话:

        待康福把全部棋子都收好后,曾国藩突然说:“价人,你想过没有,世界上的人,其实就是棋枰上的子,无论是我们还是长毛都如此。我常常这样想,每当想起这点,便很灰心,不知你想过没有?”

  “我也想过。不过我想,只有我们这些人才是棋子,大人你老不是,你老是执子的人。”康福笑着说。

  “不是的。”曾国藩摇摇头,凝重地说,“包括我在内都是棋子,都是身不由己任别人摆布的黑白之子。”

  “别人是谁呢?”康福睁大眼睛问,“是皇上吗?”

  “皇上有时是执子的人,有时又是被执的子,说到底皇上也是棋子。”曾国藩两眼望着空空的纹枰,似在深思。

  “那么这个‘别人’究竟是谁呢?”康福追问。

  “冥冥上苍!”曾国藩苦笑着回答。
      
        虽然曾国藩能力超群,欲挽清廷于不倒,后面又有李鸿章继承他的遗志,可是时势的倾颓,已无法让任何人去重新改变清朝的命运。

       曾国藩大概也算的是个悲情英雄。
      


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
曾国藩,中国近代史上的一个异数,被称为“千古完人”,“官场楷模”。他以经史之学问,治世之能臣,影响了一代又一代人。许多名人都对他推崇备至,毛泽东“独服曾文正”, 蒋介石认为曾国藩可以做自己的老师。

就命运而言,在唐浩明所作的这本《曾国藩》中记录了曾国藩历尽磨难苦闷后的深刻反思,句句入心。其中哲言嘉句数不胜数,摘录十句分享给大家:

01.

“每逢大事有静气”

曾国藩年轻时在官场沉浮,难免有心烦气躁之时,便向理学名臣唐鉴先生请教,唐鉴送了他一个字——“静”,心静下来,就能处理各种纷乱的军国大事。

从那时起,曾国藩每天都要静坐一会儿,许多为人处世、治学从政的体会和方法,便都在此中获得。尤其在遇到重大问题时,他更是不轻易作出决定,总要通过几番静思、反复权衡之后,才拿出一个主意来。为让气氛更宁馨些,还往往点上一支香。每见到这种情况,家人有再大的事也不打扰他。

02.

“从前种种,譬如昨日死;

以后种种,譬如今日生。”

这一天,曾国藩带着日记,又去拜见老师唐鉴。唐鉴审读他的日记,见满纸都是痛骂自己不成器的话,很是满意。翻到二十二日的日记,看上面写道:“自今日起改号涤生。

涤者,取涤其旧染之污也;生者,取明袁了凡之言‘从前种种,譬如昨日死,以后种种,譬如今日生也’。”唐鉴称赞:“有志气!涤生,望你今后涤旧而生新。”

03.

“不为圣贤,则为禽兽。

只问耕耘,不问收获。”

释义:如果不能以圣贤的道德标准要求自己,便只能与禽兽一般为欲望所控制。只关心付出多少,不关心结果怎样。

唐鉴曾送给曾国藩一本自著《畿辅水利》,一张亲笔楷书条幅:“不为圣贤,则为禽兽。只问耕耘,不问收获。善化唐鉴。”

跟了唐鉴一段时期,尤其在通读了他的《畿辅水利》一书后,曾国藩看出这位理学名臣并不是埋首故纸、空谈心性的书呆子,而是关心民瘼、留意经济、学问渊懿,亦不乏谋略的能吏。同样,唐鉴也知道曾国藩是老成深重、极有心计的干才。以后,唐鉴、国藩师生之间往往探讨程朱之学少,推究兴衰治乱的历史多。

04.

“轻用其芒,动即有伤,是为凶器;

深藏若拙,临机取决,是为利器。”

释义:无论是处世还是用兵,平时深藏锋芒,关键时果断出手,出手便能解决问题。

曾国藩出兵征讨太平军前,有人赠予曾国藩一口家传古剑,他的岳父欧阳老人说:“涤生(曾国藩字)今日喜得宝剑,老夫也高兴。老夫十分喜爱旧日读过的一首古剑铭,现把这首古剑铭送给你,轻用其芒,动即有伤,是为凶器;深藏若拙,临机取决,是为利器。”

曾国藩听完这首古剑铭后,明白岳父的深远用意,十分感激地站起来说:“国藩牢记在心。”

05.

“扬善于公庭,规过于私室”

释义:赞扬别人要在公开场合,批评别人要在私底下。

曾国藩率湘军攻占武昌后,六弟曾国华带领在湘乡招募的五百勇丁来到武昌。曾国藩见到这个出抚给叔父的六弟,心中很是高兴。四个弟弟,他认为最有出息的便是这个为人倜傥雄奇的六弟。于是亲向六弟传授带勇识人的经验。

曾国藩知道弟弟的脾性,说:“衡人亦不可眼界过高。人才靠奖励而出。大凡中等之才,奖率鼓励,便可望成大器;若一味贬斥不用,则慢慢地就会坠为朽庸。对待部属,大哥有两句话,望弟切记。”

国华望着大哥,诚恳地说:“请大哥赐教。”“这两句话是:扬善于公庭,规过于私室。”

国华点点头,轻轻地重复一遍。

06.

“打脱牙和血吞”

曾国藩对洋人的坚船利炮,以及诸如千里镜、自鸣钟、机器等,由衷地佩服。三十年前惨败于洋人的教训,他记忆犹新。十多年的戎马生涯,对外国与中国在军事上的悬殊他看得很清楚。一个基本认识已在他心中深深地扎下了根:与洋人相争,不在于一时一事的输赢,而在于长远的胜负。中国目前不如洋人,一旦开仗,只有失败。要靠“打脱牙和血吞”的精神,忍辱发愤,徐图自强。

07.

“天下事,有所激有所逼而成者居其半”

释义:世界上能做成的事情,多半是因为外界的压力被逼或者被激出来的。

容闳是第一个毕业于美国耶鲁大学的中国留学生,曾国藩对其抱有极大希望,一力促成其办厂办洋务,然而容闳近年在办事的过程中,深感处处棘手,步步难行,多少次都想甩手不干,但最后还是挺下来了容闳本想向曾国藩吐一肚子苦水,听曾国藩这一说,便不敢再讲了,硬着头皮把总督交给的担子担起来。

“纯甫,我知道你有难处。”曾国藩从“尽力办好”四字中,已知容闳的艰难,“老夫活了五十多岁,经事不少,知天下事有所激有所逼而成者居其半。困难之处,正可看作是激励和逼迫。”

08.

“历来有文坛上之泰山北斗,官场上却毫无建树,甚至一败涂地者,盖因不识此中差别耳!”

释义:文坛和官场是有差别的,认识不到这两者的差别,多半会一败涂地。

曾国藩麾下第一幕僚赵烈文,对大儒船山先生王夫之非常崇敬。王夫之的名作《读通鉴论》在书局刻印过程中,他便零零星星地借来读过一遍,十分佩服船山的见事高明、议论深刻。此时看着这部被装订成十大本的五十余万言巨著,真是爱不释手,心里油然生出一股对船山的由衷崇拜,“大人,船山公议论戛戛独造,破自古悠谬之谈。卑职想,若使其得位乘时,必将大有康济之效。”“不见得。”曾国藩轻轻地摇了摇头。

“为何?”赵烈文颇感意外。他深知曾国藩一向尊崇王夫之,但为什么并不赞同这个观点呢?

“船山之学确实宏深精至,但有的则嫌偏刻。比如对人的评价,求全责备的多,宽容体谅的少。若让船山处置国事,天下则无可用之人了。”曾国藩离开座位,在书案前走了几步后又说,“作文与做官并不是一回事。作文以见深识闳为佳,立论即使尖刻、偏颇点亦无妨,因为不至于伤害到某一个人,也不去指望它立即收到实效,只要自圆其说,便是理论,运笔为斤,自成大匠。做官则不同,世事纷繁,人心不一,官场复杂,尤为微妙,识见固要闳深,行事更需委婉,曲曲折折,迂回而进,当行则行,当止则止,万不可逞才使气,只求一时痛快。历来有文坛上之泰山北斗,官场上却毫无建树,甚至一败涂地者,盖因不识此中差别耳!”

09.

“乱极时站得住,才是有用之学。”

释义:能够处理极为混乱复杂局面的能力,才是真正有用的学问。

湘军之父罗泽南也是湖南大儒。与曾国藩情同手足,他在武昌城下中弹兵败,临终写信给曾国藩,提及:“近年来与长毛作战,亦有一点心得。今将远别,愿送与我兄:“乱极时站得住,才是有用之学。”万语千言,难以倾诉,愿仁兄为国珍重。

10.

“世界上的人,其实就是棋枰上的子”

康福(字价人)是曾跟随曾国藩十几年的老部下,曾国藩去世前,康福突然来看他,要回了祖传的围棋。曾国藩说:“价人,你想过没有,世界上的人,其实就是棋枰上的子,无论是我们还是长毛(太平军)都如此。我常常这样想,每当想起这点,便很灰心,不知你想过没有?”

“我也想过。不过我想,只有我们这些人才是棋子,大人你老不是,你老是执子的人。”康福笑着说。

“不是的。”曾国藩摇摇头,凝重地说,“包括我在内都是棋子,都是身不由己任别人摆布的黑白之子。”

“别人是谁呢?”康福睁大眼睛问,“是皇上吗?”

“皇上有时是执子的人,有时又是被执的子,说到底皇上也是棋子。”曾国藩两眼望着空空的纹枰,似在深思。

“那么这个‘别人’究竟是谁呢?”康福追问。

“冥冥上苍!”曾国藩苦笑着回答。
背景:博客采用了ssl的https和http访问,自己后台登录和搜索采用https,而发现在搜索时出现https://jackxiang.com/visit.php有时从www.jackxiang.com里进去后出现,https://www.jackxiang.com:80/visit.php,查看模板里的这个变量值是:action="https://{$_SERVER["HTTP_HOST"]}/visit.php",我其实是想它走https://jackxiang.com/visit.php,一查原来是这个变量的问题,于是修改成了:action="https://{$_SERVER["SERVER_NAME"]}/visit.php" 就好了,如下:

PHP $_SERVER["SERVER_NAME"]与 $_SERVER['HTTP_HOST'] 区别对比如下:
相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:
1. 通常情况:

_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

2. 当服务器为非80端口时:

_SERVER["HTTP_HOST"] 会输出端口号,例如:111cn.net:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:

httpd.conf配置如下:
<virtualhost *>
ServerName 111cn.net
ServerAlias www.111cn.net
</virtualhost>
客户端访问域名www.111cn.net
_SERVER["HTTP_HOST"] 输出 www.111cn.net
_SERVER["SERVER_NAME"] 输出 111cn.net

所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。

来自:http://www.111cn.net/phper/php-cy/59314.htm
PHP-fpm下的fpm的children参数:
Opt Children Number = Total CPU Resource / CPU Usage Per Request,
第一个是物理核数? 第二个是每个请求对cpu的使用率? 第二个数值怎么去得到呢?
来自:桶哥的一篇关于swoole的心跳的文章,作为Swoole顾问(顾得上就问,是为「顾问」)得推一下这篇文章,最后只留下一配置,其实我也不是太明白原理,我在想如果是局域网里还需要心跳?
——————————————————————————————————————————————————————————————————————
swoole提供了一个心跳的功能,很多朋友感到困惑。
心跳是什么?
顾名思义,心跳是判断一个事物生还是死的一个标准,在swoole里,心跳是指用来判断一个连接是正常还是断开的。
从TCP协议说起
我们都知道一个五元组标识一个网络连接,创建一个连接有三次握手,而断开一个连接有四次挥手。不管是服务器还是客户端
发起连接的关闭,都会完整的走完四次挥手的过程,这样,一切很完美,系统回收这个fd,应用层也可以通过onClose回调处理相关的事情.
fd是什么?
fd学名是文件描述符,在unix的哲学就是一切皆文件中,这个fd就是系统层暴露给业务层的用来表示一个五元组网络连接的标识。你可以简单的理解为一个索引,通过对这个fd的操作,系统层可以找到相应的连接而且进行的一系列操作,如发送数据到网瞳,进行连接关闭等等。
为什么要心跳?
刚才提到,如果我们要关闭某个连接,我们可以在业务层对fd发起关闭连接的操作,以swoole为例:
$server->close($fd);
正常情况下,都会走完整个四次挥手,(swoole会有onClose回调),系统回收fd,以待分配给其他的连接。
那系统为什么要回收fd,因为fd资源是有限的,所以必需重复利用。
但在某些情况下,如突然拔掉网线或蓝翔演习挖断光缆,服务端并不能感知到这个连接的异常,但实际上是这个连接已经失效了,如果没有一个回收机制,这类连接将用光所有的fd,导致系统不再能接受新的连接请求,所以就有了心跳机制。
什么是心跳机制?
心跳机制就是业务层来提供一个连接是否存活的一个方法,让系统能判定一个连接是否失效。一般有两种实现方式:
1: 客户端定时发送一个心跳包,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳包的时间是否过长,如果过长,则认为已无心跳,判定为死连接,主动关闭这个连接。
2: 服务器定时询问所有的客户端,你们还活着么?如果活着,给我个回馈,没得到回馈的客户端,格杀勿论。
两种心跳方案有什么区别?
第一种方案,对服务器和网络的压力更小,而且更具有灵活性,但需要客户端配合定时发送心跳包。
第二种方案,对服务器和网络压力更大,不建议使用。
心跳在swoole里的实现
swoole采用的是第一种方案
swoole会在主进程独立起一个心跳线程,通过定时轮询所有的连接,来判断连接的生死,所以swoole的心跳不会堵塞任何业务逻辑。
那怎么判断连接的生死了?swoole在connection结构体中有 time_t last_time 字段,用来存放最后一次收包的时间戳,进而通过与这个时间对比来判定是否存活
于是,swoole有两个配置:
heartbeat_check_interval: 服务器定时检测在线列表的时间
heartbeat_idle_time:      连接最大的空闲时间 (如果最后一个心跳包的时间与当前时间之差超过这个值,则认为该连接失效)
配置建议
建议 heartbeat_idle_time 为 heartbeat_check_interval 的两倍多一点。
这个两倍是为了进行容错,允许丢一个包
而多一点是考虑到网络的延时。
你可以跟据实际的业务来调整这个容错率(允许丢几个包)。
补充
1、系统层面也提供心跳机制,只不过粒度相对比较粗,而且时间稍长,没有应用层灵活
2、swoole还提供ping的功能,通过配置ping值,swoole内核可以判断只是一个心跳包,而不会,也没必要把数据包转发应用层(onReceive)。
3、心跳不只是swoole独有,大多数tcp的网络服务都会考虑到这个问题
背景:我们特别是在想对两个都各带一列且没有行对齐且行数不一致的关联性的文件做关联成一行的时候,会想用自己熟悉的语言去先后打开两个文件(可能高级点的语言可以一次读取到内存,以PHP这种擅长处理字符串的语言为例,且文件要小,当然你可以对PHP占用内存作调整配置。),对文件里面的所有列全部读取到数组,再用循环对数组每行进行分割提取出关联行,再读取另外一个文件一样分离出相同的部分形成数组键,值就是一行,对第一个文件里面的关联列一个一个去第二个文件里面的数组里循环查找到查到为止,找到后,对以找到的这行的key定了,当然就对应上了,这个看起来简单,得6到7行,往往伴随着那个一行里面提取部分,也就是说需要arr=explode(sep,line),取arr某些键值和第一个文件(也可能需要类似explode操作)有关联的显示出来,你还会说,这个不难,有Excel可以实现,先对这两个文件所关联列进行排序,然后,复制粘贴在一块就OK了,感觉很简单也挺棒的,但是,假如两行的数据里面有重复行,两个文件不一样的行数,这个再像linux下的paste俩文件一样行去搞可能就会有问题了,是不是有点难搞,还得去重复啥的,其灵活性可能还是欠佳,往往需求上对重复部分只留下一个就OK的处理方式居多,Excel想做到这样引入了去重复后让两行一样多的操作,SO,有没有简单可行,优雅简洁的处理方式呢?有,那就是上面描述的可以用awk一行搞定,听说由三个数学家的名字首字母发明出来的,它优雅的使用两个类似宏的东西NR,FNR两个变量实现了上面一堆功能,对行和列处理应该相当有水平,在此,我向他们致敬。
—————————————————————————————————————————————————————————————————————————
书上说:
NR,表示awk开始执行程序后所读取的数据行数.
FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计.
下面看两个例子:  
1,对于单个文件NR 和FNR 的 输出结果一样的 :
# awk '{print NR,$0}' file1
1 a b c d
2 a b d c
3 a c b d
#awk '{print FNR,$0}' file1
1 a b c d
2 a b d c
3 a c b d  
2,但是对于多个文件 :
# awk '{print NR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
4 aa bb cc dd
5 aa bb dd cc
6 aa cc bb dd
# awk '{print FNR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
1 aa bb cc dd
2 aa bb dd cc
3 aa cc bb dd
在看一个例子关于NR和FNR的典型应用:
现在有两个文件格式如下:
#cat account
张三|000001
李四|000002
#cat cdr
000001|10
000001|20
000002|30
000002|15
想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
执行如下代码
#awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
注释:
由NR=FNR为真时,判断当前读入的是第一个文件account,然后使用{a[$2]=$0;next}循环将account文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.
解释,在读取文件1时候,形成如下数组结构:
a[000001]=张三|000001
a[000002]=李四|000002
                …………
由NR=FNR为假时,判断当前读入了第二个文件cdr,然后跳过{a[$2]=$0;next},对第二个文件cdr的每一行都无条件执行{print a[$1]"|"$2},此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件第二个字段$2为数组下标相同.因此可以在此使用a[$1]引用数组。

解释,按顺序读取到第二个文件时候,文件二第一行输出数组和第二列,如下:
a[000001]  | 10    =>   张三|000001 | 10

第一个文件的第二列和第二个文件的第一列关联,a数组存的是第一个文件的按第二列为键值每行。
总结,NR,FNR结合next循环,在数组的key存放关键关联列信息,这个逻辑的核心就在于此,再通过这个awk列$N(N为第几列)优势,只要有关联列,就能这样去匹配出来的行可以任意列输出,相当灵活,优雅,简洁。

=====================自己在日常中的实践如下AddTime:2016-03-25===========================
两个文件里都有UUID的编号及对应的线上机器下载的UUID文件名及后缀,想变成对应的用户上传的中文名加后缀:
(中文名里有各种符号像中文的括号、竖线、空格啥的都得去掉,否则批量肯定会没法成功重命名,需求相当可恶)
windows操作系统虽然好用,但是并不适合研发人员,它的命令行(暂且只说dos, 虽然可以用vb, vbscript,
但是本人不太熟悉,写法上也不太适合做编程)实在是太弱了,想想linux下的shell,用起来还是挺方便的!
方法一:
bianhua_move_comand.txt   //得把那个uuid列先单出来,当然,也可用split进行分割直接取数组1,先讲一次性解决,再讲两步来处理。
cee7b22e-f502-4fed-85a4-1db2c8c42468.mp4
1aabd2ac-2133-43d6-921d-b5bd2a34182e.mp4
./bianhua_title_uuid.txt
【新春征集】重庆两江新区《龙兴》        cee7b22e-f502-4fed-85a4-1db2c8c42468
【新春征集】重庆两江新区《伟业》        1aabd2ac-2133-43d6-921d-b5bd2a34182e

awk能够指定分隔符既可以为制表符,又可以为点,那么处理将会变得简单。可以使用正则表达式来指定多个分隔符,格式为 -F[\\t.],
直接指定两个分割符号,分别是\t,和.点,注意斜杠需要转义,awk中-F可指定两种或多种分割符号用[]括起来,awk语句及执行如下所示:

结果达到了mv移动的目的:                                                                            ......
mv /path/cee7b22e-f502-4fed-85a4-1db2c8c42468.mp4 /path/newfolder/【新春征集】重庆两江新区《龙兴》.mp4
mv /path/1aabd2ac-2133-43d6-921d-b5bd2a34182e.mp4 /path/newfolder/【新春征集】重庆两江新区《伟业》.mp4

方法二:
当然,也可分两次来做,把关联的列都单独出来后,再用awk去做这个事情,总之,都需要写split分割,如下步骤:
awk -F. '{print $1"\t"$0"\t"$2}' bianhua_move_cond.txmat  > bianhua_move_comand2.txt
bianhua_move_comand2.txt
经上面的awk处理后其 ./bianhua_move_comand2.txt 结构如下所示:
1aabd2ac-2133-43d6-921d-b5bd2a34182e 1aabd2ac-2133-43d6-921d-b5bd2a34182e.mp4        .mp4
1aabd2ac-2133-43d6-921d-b5bd2a34182e 1aabd2ac-2133-43d6-921d-b5bd2a34182e.mp4        .mp4

把以UUID的文件移到新的目录,并以中文对应名进行赋值,如下:
awk -F\\t 'NR==FNR{a[$1]=$0;next}NR>FNR{if($2 in a) split(a[$2],array,"\\t");print "mv /path/"array[2] " /path/newfolder/"$1array[3]}'  bianhua_move_comand2.txt  bianhua_title_uuid.txt

其实,去掉NR>FNR也一样可以运行,如下:

最后,还可以去掉in的数组判断,更加简化:


mv /path/cee7b22e-f502-4fed-85a4-1db2c8c42468.mp4 /path/newfolder/【新春征集】重庆两江新区《龙兴》.mp4
mv /path/1aabd2ac-2133-43d6-921d-b5bd2a34182e.mp4 /path/newfolder/【新春征集】重庆两江新区《伟业》.mp4

附录:
split(str,array,sep)
使用分隔符sep把字符串分解成数组array
if($2 in a) //假如这个$2变量在数组里面
-F \\t \|  //以斜杠转义下斜杠,制表符和竖线,-F是awk指定的分割符。
假如用PHP实现的大致的流程,和上面一行解决问题起到一个比对作用:
rename.php

实践的最初素材来自:http://www.linuxidc.com/wap.aspx?nid=61174 ,及相关人的讲解,Thanks...
首先让我们来回忆一下历史久远的手动记录日志功能:“文件”——“会话日志”,选择日志文件的存放位置并拟定文件名,点击保存。
自动记录日志功能:
1.       选择“选项”——“全局选项”,打开全局选项,在常规设置中找到“默认会话”设置项,点击右侧的“编辑默认设置”:
英文版下:选择“Options”——“Global Options”,打开全局选项,在常规设置中找到“default session”设置项,点击右侧的“edit default settings”:
2.       上一步骤操作后,打开如下图所示的界面,选择“日志文件”(英文版下选择“Log file”),如下图所示,让我们分别解释一下右侧四个红色方框部分。

http://jingyan.baidu.com/article/335530da88aa0b19cb41c3b9.html
浏览器和服务器之间是通过 HTTP 协议进行连接通讯的。这是一种基于请求和响应模型的协议。浏览器通过 URL 向服务器发起请求,Web 服务器接收到请求,执行一段程序,然后做出响应,发送相应的html代码给客户端。
这就有了一个问题,Web 服务器执行一段程序,可能几毫秒就完成,也可能几分钟都完不成。如果程序执行缓慢,用户可能没有耐心等下去,就关闭浏览器了。
而有的时候,我们更本不关心这些耗时的脚本的返回结果,但却还要等他执行完返回,才能继续下一步。
那么有没有什么办法,只是简单的触发调用这些耗时的脚本然后就继续下一步,让这些耗时的脚本在服务端慢慢执行?
经过试验,总结出来几种方法,和大家share:
1. 最简单的办法,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一个img标签,src指向要执行的耗时脚本。
这种方法最简单,也最快。服务器端不用做任何的调用。
但是缺点是,一般来说Ajax都应该在onLoad以后触发,也就是说,用户点开页面后,就关闭,那就不会触发我们的后台脚本了。
而使用img标签的话,这种方式不能称为严格意义上的异步执行。用户浏览器会长时间等待php脚本的执行完成,也就是用户浏览器的状态栏一直显示还在load。
当然,还可以使用其他的类似原理的方法,比如script标签等等。
2. popen()
resource popen ( string command, string mode );
//打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
所以可以通过调用它,但忽略它的输出。
pclose(popen("/home/xinchen/backend.php &"
这个方法避免了第一个方法的缺点,并且也很快。但是问题是,这种方法不能通过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。并且只能单向打开,无法穿大量参数给被调用脚本。
并且如果,访问量很高的时候,会产生大量的进程。如果使用到了外部资源,还要自己考虑竞争。
3. 使用CURL
这个方法,设置CUROPT_TIMEOUT为1(最小为1,郁闷)。也就是说,客户端至少必须等待1秒钟。
$ch = curl_init(); $curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php', CURLOPT_RETURNTRANSFER, 1, CURLOPT_TIMEOUT, 1,); curl_setopt_array($ch, $curl_opt); curl_exec($ch); curl_close($ch);
4. 使用fsockopen
这个方法应该是最完美的,但是缺点是,你需要自己拼出HTTP的header部分。
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET /backend.php / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); /*忽略执行结果 while (!feof($fp)) { echo fgets($fp, 128); }*/ fclose($fp); }
所以,总体来看,最好用,最简单的还是第一种方法。
最完美的应该是最后一种,但是比较复杂
如果有更好的办法,欢迎交流。
来自:http://www.laruence.com/2008/04/14/318.html

背景:运行指定扩展配置文件extension.ini的扫描目录,这样结构化有利于运维进行模块添加,也是后来我运维时看到并实践的文章,参考文章,http://jackxiang.com/post/8613/。


/usr/local/php/etc/php.d/redis.ini
php -m|grep redis
redis
是因为有:
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-config-file-scan-dir是搜索下面的ini文件和php.ini一起使用,好处就是扩展的那些extension="xx.so"可以放里面,每个扩展一个ini文件,可以方便的用自动化脚本或者部署脚本来搞,看起来模块化了


'—with-config-file-path=/data/software/php-5.6.15/lib/php.ini

open("/data/software/php-5.6.15/bin/php-cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/data/software/php-5.6.15/lib/php.ini/php-cli.ini", O_RDONLY) = -1 ENOTDIR (Not a directory)
open("/data/software/php-5.6.15/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/data/software/php-5.6.15/lib/php.ini/php.ini", O_RDONLY) = -1 ENOTDIR (Not a directory)


求问这是bug么?
--with-config-file-path=PATH
  --with-config-file-scan-dir=PATH
—with-config-file-path 这个是用来指定目录,不是指定文件。
scan这个干嘛的?还能指定php去这个配置目录扫描?
http://php.net/manual/zh/function.php-ini-scanned-files.php
php.conf.d/*.ini

应该一个是cli,一个是运行服务的吧?
不是吧 应该是搜索这个目录下的 *.ini 文件吧

scan是扩展配置文件目录
cli sapi默认都是编译时指定的位置,也可以手动指定

嗯,--with-config-file-scan-dir是搜索下面的ini文件和php.ini一起使用,好处就是扩展的那些extension="xx.so"可以放里面,每个扩展一个ini文件,可以方便的用自动化脚本或者部署脚本来搞,看起来模块化了


关于opcache想编译成静态所谓提高效率:

PHP 5.5.0 及后续版本,
OPcache 只能编译为共享扩展。
—————————————————
理论上性能好点儿,高并发可能瓶颈不在这儿,所以不明显。
静态这个是迷信 嘿嘿,嗯 所以我说这是我自己的迷信 嘿嘿。
F11相当于windows中的“显示桌面”:
fn + F11 显示桌面。
背景:有时查看目录结构,这个tree非常有用,yum -y install tree安装就能使用。
FreebsD:  Have you tried installing tree with:  pkg install tree ,cd /usr/ports/sysutils/tree make install  
来自:https://www.reddit.com/r/freebsd/comments/4kxyx1/newbie_having_trouble_using_tree_command/

相关参数说明及常用参数说明:
要想目录和文件有颜色,或是用Tree看有颜色,得用那个SecureCRT做下配置:
Session Options->Terminal->Emulation->Terminal [Linux/Xterm] [V]ANSI Color @老武用的是Linux可以,我用的是Xterm也行,颜色可调一下即可。
常常加 -C,表示颜色,-L表示层级。 如:tree -C -L 2。
-C            Turn colorization on always.

阅读全文
php7 memcache 扩展你们用哪个版本安装成功的?
https://github.com/php-memcached-dev/php-memcached/tree/php7
php7 的redis扩展 有吗?
https://github.com/phpredis/phpredis/tree/php7@tru
背景:对于kohana早期框架对类里面的before after以及controller和action的函数均可以用反射类来灵活按既定顺序执行,而在执行的时候假如异常,可以通过PHP提供的异常捕获进行捕获输出,这就涉及到类变对象后其参数的传递问题了,怎么给反射类里面的函数传递多参数乃至引用参数,这个PHP也提供了对应的反射类里函数传入的方法ReflectionMethod::invokeArgs。
使用代码片段如下:

参考更多相关反射的文章:
http://flandycheng.blog.51cto.com/855176/326021/
http://www.phperz.com/article/14/0809/17371.html

自己研究:http://jackxiang.com/post/2090/

ReflectionMethod::invokeArgs

(PHP 5 >= 5.1.0)

ReflectionMethod::invokeArgs — 带参数执行

说明

public mixed ReflectionMethod::invokeArgs ( object $object , array $args )
使用数组给方法传送参数,并执行他。
参数
object
调用方法的对象,如果是静态对象,设置为 null
args
使用 array 传送的方法参数。
返回值
返回方法返回值
错误/异常
如果 object 指定的实例无法执行方法,那么产生 ReflectionException 异常。
如果方法调用失败,产生 ReflectionException
范例
Example #1 ReflectionMethod::invokeArgs() example

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>
以上例程会输出:
Hello Mike
注释
Note:
如果函数有参数需为引用,那么它们必须以引用方式传入。
参见
ReflectionMethod::invoke() - Invoke
__invoke()
call_user_func_array() - 调用回调函数,并把一个数组参数作为回调函数的参数
来自:http://help.bitscn.com/php/reflectionmethod.invokeargs.html
背景:这玩意是感觉把rpc的生成变成他自己的了,有点意思,不知底层是不是还是xdr交换统一数据结构,还是php的unpack实现客户端的。
http://www.tuicool.com/articles/NV3Yni3

背景:对于ip限定缩小范围,最好是采用出口IP通过公司的所有进行放行,而获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR)的,所以最好是nginx在代理时就限定死:
deny  *.*.*.66;
deny  *.*.*.79;
deny  *.*.*.80;
deny  *.*.*.77;
Nginx的日志的最后一个IP并不安全:


*.*.*.57 - jackxiang.com [15/Mar/2016:18:02:33 +0800] "GET /h5ds/themes/common/mobile/js/maps/swiper.min.js.map HTTP/1.0" 404 20 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53" 202.*.*.78  
分析过程
这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。

function getIP() {
  if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $realip = $_SERVER['HTTP_CLIENT_IP'];
  } else {
    $realip = $_SERVER['REMOTE_ADDR'];
    }
    return $realip;
  }
这个是网上常见获取,ip函数,用这些值获取IP,我们首先要弄清楚,这些数据是从那个地方传过来的。

IP获取来源
1.’REMOTE_ADDR’  是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。

如:a->b(proxy)->c  ,如果c 通过’REMOTE_ADDR’ ,只能获取到b的IP,获取不到a的IP了。

另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。

2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2  所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。

来自:http://blog.chacuo.net/98.html
背景:目前虚拟机和云的兴起,对一些应用的封装啥的还没有火起来,比如:FreeBSD的jail啥的,目前出了一个叫docker的,可以了解了解。

基本概念
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的“Build once,Run anywhere”

备注:java提出的是” compile Once,Run Anywhere”
Docker与linux内核的关系
docker与linux内核的关系
Cgroup: 对资源进行限制(如对物理资源CPU、内存、I/O的限制)
Namespace:对进程进行隔离
Chroot: 能改变当前运行的进程和子进程的根目录
AUFS:联合文件系统,Docker利用AUFS将不同的Layer结合到1个image中去
Docker架构
Docker采用C/S架构,客户端与服务器端不一定要在一起。客户端可以运行在windows、linux等机器上,然后服务器端必须运行在linux 64bit的操作系统上。
Docker“组件间”关系
ü  主机:运行容器的机器
ü  镜像:文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上
ü  容器:一个从镜像中启动,包含正在运行的程序的进程
ü  Registry(镜像仓库):存放镜像的地方,如Docker Hub
ü  Volumn(卷):将物理机的文件夹挂载到容器内部.与openstack的volumn不一样,openstack中的卷是块存储,不能共享。而这里的volumn可以共享。
ü  Dockerfile:用于创建镜像的脚本
Docker应用场景
面向开发人员:快速开发、交付应用程序
主要体现在三个方面:
ü  代码一致:
在没有docker之前,开发、测试、生成环境可能不一样,如发布某个服务的端口时,开发是1000,而生产是2000,这就导致配置文件不一致。然而使用docker后,我在容器内的端口都是一样的,而容器对外暴露的端口可能不一样。
ü  开发环境与生产环境的一致性
我们知道,在生产环境的部署比较复杂,服务非常繁多。通过docker,我们可以单机版上通过容器来模拟生产环境的分布式环境。从而让开发人员的开发更有效率。
ü  快速部署
可以将docker理解为轻量级的虚拟机,启动docker容器速度很快,启动虚拟机很慢。
面向运维人员:降低运维成本
ü  节约安装各种软件的时间。
     在没有docker之前,在部署程序之前,势必要搭建环境,而搭建环境很花费时间,还要解决环境的各种依赖,而docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可。
ü  降低运维成本。
在没有docker之前,由于技术不断发展,运维也要不停的学习各种软件的使用技能,如Node.js、redis等。有了docker,根本不用关系这些技术(或者少关心),只需要关注容器就可以了,能够正常的发布容器,停止容器、删除容器、迁移容器就可以了。
面向企业: Paas层的实现
Coding.net、Oschina这些代码托管平台,有个功能即提供给用户程序的演示环境,我不知道他们底层到底采用的什么技术,但是如果Iaas层的openstack,给用户直接提供虚拟机,先得太“笨重”,因为虚拟机本身对物理机的开销就比较大,如果采用Docker,我1台物理机可以部署多个容器,可以降低企业的采购物理机的费用,而且运行效率上应该比采用Iaas层的方案快。

Docker基本命令
Docker安装相关命令
参考: https://docs.docker.com/installation/ubuntulinux/

摘自:http://blog.csdn.net/opensure/article/details/46490749
分页: 18/248 第一页 上页 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 下页 最后页 [ 显示模式: 摘要 | 列表 ]