php-fpm如何重启、启动和终止?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2915 次浏览 • 2017-08-18 11:39 • 来自相关话题

jquery中attr和prop的区别

前端开发zkbhj 发表了文章 • 0 个评论 • 1465 次浏览 • 2017-08-17 21:00 • 来自相关话题

在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了。

关于它们两个的区别,网上的答案很多。这里谈谈我的心得,我的心得很简单:
对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

上面的描述也许有点模糊,举几个例子就知道了。
<a href="http://www.baidu.com" target="_self" class="btn">百度</a> 这个例子里<a>元素的DOM属性有“href、target和class",这些属性就是<a>元素本身就带有的属性,也是W3C标准里就包含有这几个属性,或者说在IDE里能够智能提示出的属性,这些就叫做固有属性。处理这些属性时,建议使用prop方法。
<a href="#" id="link1" action="delete">删除</a>这个例子里<a>元素的DOM属性有“href、id和action”,很明显,前两个是固有属性,而后面一个“action”属性是我们自己自定义上去的,<a>元素本身是没有这个属性的。这种就是自定义的DOM属性。处理这些属性时,建议使用attr方法。使用prop方法取值和设置属性值时,都会返回undefined值。


再举一个例子:
<input id="chk1" type="checkbox" />是否可见
<input id="chk2" type="checkbox" checked="checked" />是否可见像checkbox,radio和select这样的元素,选中属性对应“checked”和“selected”,这些也属于固有属性,因此需要使用prop方法去操作才能获得正确的结果。
$("#chk1").prop("checked") == false
$("#chk2").prop("checked") == true如果上面使用attr方法,则会出现:
$("#chk1").attr("checked") == undefined
$("#chk2").attr("checked") == "checked" 引自:http://www.cnblogs.com/Showsha ... .html 查看全部
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了。

关于它们两个的区别,网上的答案很多。这里谈谈我的心得,我的心得很简单:
  1. 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。
  2. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。


上面的描述也许有点模糊,举几个例子就知道了。
<a href="http://www.baidu.com" target="_self" class="btn">百度</a>
 这个例子里<a>元素的DOM属性有“href、target和class",这些属性就是<a>元素本身就带有的属性,也是W3C标准里就包含有这几个属性,或者说在IDE里能够智能提示出的属性,这些就叫做固有属性。处理这些属性时,建议使用prop方法。
<a href="#" id="link1" action="delete">删除</a>
这个例子里<a>元素的DOM属性有“href、id和action”,很明显,前两个是固有属性,而后面一个“action”属性是我们自己自定义上去的,<a>元素本身是没有这个属性的。这种就是自定义的DOM属性。处理这些属性时,建议使用attr方法。使用prop方法取值和设置属性值时,都会返回undefined值。


再举一个例子:
<input id="chk1" type="checkbox" />是否可见
<input id="chk2" type="checkbox" checked="checked" />是否可见
像checkbox,radio和select这样的元素,选中属性对应“checked”和“selected”,这些也属于固有属性,因此需要使用prop方法去操作才能获得正确的结果。
$("#chk1").prop("checked") == false
$("#chk2").prop("checked") == true
如果上面使用attr方法,则会出现:
$("#chk1").attr("checked") == undefined
$("#chk2").attr("checked") == "checked"
 引自:http://www.cnblogs.com/Showsha ... .html

Yii2框架对入参进行验证的方法

Yii框架zkbhj 发表了文章 • 0 个评论 • 1774 次浏览 • 2017-08-08 20:22 • 来自相关话题

//获取验证参数
$model = \yii\base\DynamicModel::validateData([
'activity_code' => Yii::$app->getRequest()->post('activity_code'),
'uid' => Yii::$app->getRequest()->post('uid'),
'username' => Yii::$app->getRequest()->post('username'),
'phone' => Yii::$app->getRequest()->post('phone'),
'answer_1' => Yii::$app->getRequest()->post('answer_1'),
'answer_2' => Yii::$app->getRequest()->post('answer_2'),
'answer_3' => Yii::$app->getRequest()->post('answer_3')
], [
[['uid', 'activity_code', 'username', 'phone'], 'required'],
[['answer_1', 'answer_2', 'answer_3'], 'safe']
]);

if ($model->hasErrors()) {
FnModel::failureRespone('100001', $model->getErrors());
Yii::$app->end();
} 查看全部
//获取验证参数
$model = \yii\base\DynamicModel::validateData([
'activity_code' => Yii::$app->getRequest()->post('activity_code'),
'uid' => Yii::$app->getRequest()->post('uid'),
'username' => Yii::$app->getRequest()->post('username'),
'phone' => Yii::$app->getRequest()->post('phone'),
'answer_1' => Yii::$app->getRequest()->post('answer_1'),
'answer_2' => Yii::$app->getRequest()->post('answer_2'),
'answer_3' => Yii::$app->getRequest()->post('answer_3')
], [
[['uid', 'activity_code', 'username', 'phone'], 'required'],
[['answer_1', 'answer_2', 'answer_3'], 'safe']
]);

if ($model->hasErrors()) {
FnModel::failureRespone('100001', $model->getErrors());
Yii::$app->end();
}

什么是代码的坏味道?

回复

专业名词zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4133 次浏览 • 2017-08-01 16:51 • 来自相关话题

时间管理总结

总结zkbhj 发表了文章 • 0 个评论 • 2293 次浏览 • 2017-07-28 09:51 • 来自相关话题

时间管理的核心

时间管理有很多种方法,而GTD(全称:Getting Things Done)就是其中一套行之有效的方法,也是现在最受欢迎的方法。Getting Things Done翻译成中文就是“把事情做完”,GTD的核心理念概括就是 “通过记录的方式把头脑中的各种事情移出来,然后整理安排自己去执行”。带着一些自己的理解,下面谈一谈我对GTD的理解以及方法论,GTD的核心步骤为五步:收集、处理、管理、执行、回顾。





 
1. 收集 —— 收集记录

人的大脑能储存很多东西,但有限,不要相信某事情发生后过了一段时间你还能记得,释放大脑的储存负载,让大脑着重于去思考,平时有什么信息、任务和灵感要在忘记之前用工具记录下来,使用的工具要尽可能的方便,易用,便捷。

2. 处理 —— 处理分类

只有及时处理信息,对信息及时做出决定和归纳成类,你才能避免信息的堆积和碎片化,处理信息时采用二分钟法则和四象限法则,二分钟方法就是如果一件事情两分钟内能解决的事情,无论是何种事情,马上着手解决掉,如果不能再进行分类。分类则采用四象限法则,四象限法则是把工作按照重要和紧急两个不同的程度划分成四个“象限”:既紧急又重要、重要但不紧急、紧急但不重要、既不紧急也不重要。





 
3. 计划 —— 计划安排

除了既有的日程安排外,可以设定每日,每周,每月,每年你需要完成的重大事件,把他们排进日程表。每天要做的事件采用三只青蛙理论,前天晚上睡觉前设定第二天最重要的三件事,起床后就可以开始着手这三件事了(同理可用于每月的“三只青蛙”, 每季度的“三只青蛙”,每年的“三只青蛙”)。每周要做的事采用习惯21天效应,一件事只要坚持21天就能习惯成自然,成为一种习惯。每月要做的事采用日历行程表的方法,将每月要做的事排进日程表。每年要做的事采用原望清单法,让自己每年都有收获和进步。










 
4. 执行 —— 坚决执行

执行是Getting Things Done最关键的一步,也是成功与否的关键,要言行一致,制定了计划就一定得做到,这能很好地提升你的自我认同感。执行时你应当在不分心的情境下,一次只执行一件事,既不要多线工作,也不要让你的工作突然中断。采用番茄工作法,将番茄时间设为25分钟,专注工作,中途不做任何与该任务无关的事,直到番茄时钟响起,然后短暂休息5分钟继续番茄时钟,每4个番茄时段可多休息一会儿。番茄工作法极大地提高了工作的效率,还会有意想不到的成就感。





 
5. 回顾 —— 回顾检查

目前我采用的是一周回顾一次,采用PDCA循环法对长期目标、中期目标和短期目标进行回顾,对工作和其它事情进行回顾,看看哪里做的不好,需要改进,重新做出调整计划。这样能使得计划更有效地进行,更加合乎工作程序的逻辑。




 
我的时间管理方法论

智能手机在日常生活中扮演着重要角色,我们依赖并已经离不开智能手机,原本应该是用“碎片时间”拿手机处理事务与放松,现在却让手机把我们的生活“碎片化”了,我们总是不小心就会在手机上耗费掉大量时间,但我们从中获取的收益却远不如期望中的大,如何妥善地使用手机值得我们深思,下面谈谈我用手机做时间管理的实践方案。
  
做一只”大公鸡”

时间管理往往都是从早睡早起做起的,诚然,要做到早睡早起不会是件轻松的事,有时甚至是件折磨人的事情,但就是这样一个早睡早起的改变,它会像一根线一样牵动着其他东西一同改变,让你变得不一样,让你终生受益。除了精神状态会变好,一天时间会变“长”外,早起吃一份自己喜欢的早餐会让你更从容地应对新的一天。

Sleep Cycle是一款可以很好的记录你的睡眠质量,甚至可以改善你的睡眠质量的APP, 其原理是监测你的睡眠深度,然后在浅睡眠阶段温柔地把你唤醒,让你如同自然醒般的舒适,醒后大脑能保持高效率运转。





 
不要总是想着再小睡一会儿 (其实就是赖床),那只会让你更加想睡,更加没法起床,咬咬牙告诉自己只要两分钟,两分钟我就能清醒了。就像一句话说的,你总想做一个优秀的人,做一些惊天动地的事,可是你连早点起床都做不到。如果是工作的原因没办法早睡早起,那也要让自己的作息时间规律起来,没办法做早睡早起的大公鸡,那就做晚睡晚起的猫头鹰。

更简洁的To-do List

To-do List对于时间管理的作用不言而喻,它能够让你明确接下来要做什么,先做什么,什么最重要,让你的工作更顺畅、有条理、更有紧迫感。比如,临睡前列出明天最重要的三件事,起床后就可以开始着手这三件事了。

Clear是一款方便快捷的轻量级To-do List应用,令人上耳目一新的设计和交互方式,只为用户提供待办事项列表,没有任何复杂的功能,可以各种手势对Clear进行操作,学习成本低,上手极快。





 
我的使用经验是: Clear主要用于偶然灵感的记录,简单的文字记录,短期事件的提醒(1-3天),还有就是购物清单,记录的原则是不要让Clear列表清单过于碎片化,判断是否能加入Clear列表采取两分钟原则,两分钟内能解决的事情,无论是何种事情,马上着手解决掉,如果不能再加入Clear列表。

日历行程表终结者

备忘录、日历和提醒事项是构成手机日历行程表的核心要素,备忘录主要用于记录文字或者用作粘贴板存放一些需要经常复制使用的东西。日历是以时间顺序为线索,将所有事件组织起来。提醒事项则一般是应该尽快完成的事情。提醒事项与日历中的添加事件很相似,最大的不同就是事件的组织形式,日历以时间顺序为线索,而提醒事项可以对事件性质进行分类,如可以分成工作、生活、学习等。所有有日期要求的事件,写入日历,没有具体日期要求的又是两分钟做不完的事件,写入提醒事项。会干扰你当天的工作重点的事件,写入日历,不会干扰你当天的工作重点的,属于未进行划分的工作,写入提醒事项。日历的事件尽可能要少,一旦设置就要认真按时完成,提醒事项一旦设置就要尽快完成, as soon as possible.

AwesomeNote是一款创新的笔记和待办事项管理应用,也是奶酪认为在iOS上最好的笔记应用,精美的界面,层次分明的文件夹分类,最重要的原因是它能同步原生日历和原生提醒,还能同步到Evernote (印象笔记),这使得AwesomeNote能够在手机端和电脑端同时使用,这很重要。





我的使用经验是: 日历和提醒事项使用手机原生工具,然后同步到AwesomeNote中,用Clear做短期计划,用AwesomeNote做记事本、有规律的循环事件、中期长期计划,包括:

日记 —— (标注格式为日记) 每天写的日记,我用的方法是问答式记录:今天学到了什么知识,是什么样的状态,有什么新闻,遇到了什么人,有什么进步和值得反省的事。旅行日记通常图片会比较多,我的选择是用百度网盘来保存。
纪念 —— (标注格式为纪念日) 家人朋友的生日和重要的纪念日,设定在该日期的前一天提醒你,然后送上你的祝福和惊喜吧。
待办 —— (标注格式为任务) 需要做计划去办的中期和长期事项,比如年度愿望清单,瘦身计划等。
原生日历 —— 日历的事件尽可能要少,一旦设置就要认真按时完成。
原生提醒事项 —— Clear用于短期(1-3天内)的事件提醒,原生提醒事项用于每月有规律的事件提醒。

优秀是一种习惯

古希腊哲学学亚里士多德说过 “优秀是一种习惯”,一些优秀的人之所以能够创造出令人瞩目的成就,是因为他们在日常生活、工作和学习中养成了各种各样良好的习惯。优秀是一种气质、优秀是一种状态、优秀更是一种习惯。一个人的习惯往往就是一个人性格的缩影, 我们的一言一行都是日积月累养成的习惯。如果说优秀是一种习惯,那么懒惰和平庸也是一种习惯。

Habit List是一款极简设计风格的习惯养成应用,界面精美,操作简单,直观的统计功能,还有灵活的周期设置功能,唯一的就是缺点是没办法跨平台使用。





 
好习惯的培养和坏习惯的改正都不会是轻而易举的,习惯养成需要循序渐进,由浅入深,由近及远,需要宁少勿多、宁简勿繁、宁易勿难。先找一个比较容易做到的,做起来有兴趣的,很快就能尝到甜头的,而且能不断受到自己和周围人激励的习惯开始,一个习惯如果坚持了21天就给自己一个奖励吧,如果没有坚持下来那就给自己一个小小的惩罚吧。

番茄能治拖延症

明明知道那件事必须要做了,可就是迟迟不能开始,再给两分钟培养培养工作情绪,然后拖拖拉拉了半小时,工作时随手刷刷朋友圈,结果把手上的工作给放下了,这就是 “如果还有明天,你的工作是永远没法做完”的原因。番茄工作法是简单易行的时间管理方法,在一个个短短的25分钟内,收获的不仅仅是效率,还会有意想不到的成就感。

pomotodo是一款结合了番茄工作法和To-do List的在线工具,多平台支持,可惜暂时没有Firefox拓展,是用电脑工作时番茄工作法的绝佳选择。操作方法很简单,首先规划好今天要完成的几个任务,选择其中的一个任务,设定番茄钟直到番茄钟响起(25分到),休息5分钟后(喝水、活动、回QQ,看手机信息都行),开始下一个番茄钟,每四个番茄钟后,休息25分钟。中断如果遇到非得马上做不可的事,那么停止这个番茄钟并宣告它作废,完成这件事情之后再重新开始同一个番茄钟,如果是不是必须马上去做的事,在列表里标记下来就可以了。 





Forest是一款创新性的应用,它创新性地将番茄工作法与种树的小游戏结合,当我们需要专注投入一件事情时,用Forest种下一棵树,其间Forest会默默倒计时监督用户不要碰手机,只有在不退出应用的情况下树才能成活,退出则会直接导致树木枯死,以勉励用户中途不要碰手机,旨在帮助用户戒掉“依赖手机”的坏毛病。





 
我认为的时间管理

我认为任何工作都应该要有计划,以明确目的,避免盲目,使得工作有条不紊,循序渐进。有计划的生活能让你的从容不迫地度过每一天,很多时候的压力来自于我们不知道自己接下来该干些什么。GTD时间管理可以帮助我们合理地安排时间,高效地提升工作效率,正确地应对工作,让我们成为时间的主人。但是,时间管理的目的并不只是为了在短时间之内做更多的事,让人机器人般工作。高效率和严谨地按计划行事固然好,但如果只是按部就班的话,我们的生活中可能会出现一些缺失的美好,我们应该发挥人的主观能动性,让我们的工作带有创造性。

所以,我认为的时间管理的是让生活「慢」一点,让你「没有压力」地去做一些自己喜欢的事,让你的「从容不迫」地度过每一天。 查看全部
时间管理的核心

时间管理有很多种方法,而GTD(全称:Getting Things Done)就是其中一套行之有效的方法,也是现在最受欢迎的方法。Getting Things Done翻译成中文就是“把事情做完”,GTD的核心理念概括就是 “通过记录的方式把头脑中的各种事情移出来,然后整理安排自己去执行”。带着一些自己的理解,下面谈一谈我对GTD的理解以及方法论,GTD的核心步骤为五步:收集、处理、管理、执行、回顾。

runningcheese-gtd-01.png

 
1. 收集 —— 收集记录

人的大脑能储存很多东西,但有限,不要相信某事情发生后过了一段时间你还能记得,释放大脑的储存负载,让大脑着重于去思考,平时有什么信息、任务和灵感要在忘记之前用工具记录下来,使用的工具要尽可能的方便,易用,便捷。

2. 处理 —— 处理分类

只有及时处理信息,对信息及时做出决定和归纳成类,你才能避免信息的堆积和碎片化,处理信息时采用二分钟法则和四象限法则,二分钟方法就是如果一件事情两分钟内能解决的事情,无论是何种事情,马上着手解决掉,如果不能再进行分类。分类则采用四象限法则,四象限法则是把工作按照重要和紧急两个不同的程度划分成四个“象限”:既紧急又重要、重要但不紧急、紧急但不重要、既不紧急也不重要。

runningcheese-gtd-02.png

 
3. 计划 —— 计划安排

除了既有的日程安排外,可以设定每日,每周,每月,每年你需要完成的重大事件,把他们排进日程表。每天要做的事件采用三只青蛙理论,前天晚上睡觉前设定第二天最重要的三件事,起床后就可以开始着手这三件事了(同理可用于每月的“三只青蛙”, 每季度的“三只青蛙”,每年的“三只青蛙”)。每周要做的事采用习惯21天效应,一件事只要坚持21天就能习惯成自然,成为一种习惯。每月要做的事采用日历行程表的方法,将每月要做的事排进日程表。每年要做的事采用原望清单法,让自己每年都有收获和进步。

runningcheese-gtd-03.png


runningcheese-gtd-04.png

 
4. 执行 —— 坚决执行

执行是Getting Things Done最关键的一步,也是成功与否的关键,要言行一致,制定了计划就一定得做到,这能很好地提升你的自我认同感。执行时你应当在不分心的情境下,一次只执行一件事,既不要多线工作,也不要让你的工作突然中断。采用番茄工作法,将番茄时间设为25分钟,专注工作,中途不做任何与该任务无关的事,直到番茄时钟响起,然后短暂休息5分钟继续番茄时钟,每4个番茄时段可多休息一会儿。番茄工作法极大地提高了工作的效率,还会有意想不到的成就感。

runningcheese-gtd-05.png

 
5. 回顾 —— 回顾检查

目前我采用的是一周回顾一次,采用PDCA循环法对长期目标、中期目标和短期目标进行回顾,对工作和其它事情进行回顾,看看哪里做的不好,需要改进,重新做出调整计划。这样能使得计划更有效地进行,更加合乎工作程序的逻辑。

runningcheese-gtd-06.png
 
我的时间管理方法论

智能手机在日常生活中扮演着重要角色,我们依赖并已经离不开智能手机,原本应该是用“碎片时间”拿手机处理事务与放松,现在却让手机把我们的生活“碎片化”了,我们总是不小心就会在手机上耗费掉大量时间,但我们从中获取的收益却远不如期望中的大,如何妥善地使用手机值得我们深思,下面谈谈我用手机做时间管理的实践方案。
  
做一只”大公鸡”

时间管理往往都是从早睡早起做起的,诚然,要做到早睡早起不会是件轻松的事,有时甚至是件折磨人的事情,但就是这样一个早睡早起的改变,它会像一根线一样牵动着其他东西一同改变,让你变得不一样,让你终生受益。除了精神状态会变好,一天时间会变“长”外,早起吃一份自己喜欢的早餐会让你更从容地应对新的一天。

Sleep Cycle是一款可以很好的记录你的睡眠质量,甚至可以改善你的睡眠质量的APP, 其原理是监测你的睡眠深度,然后在浅睡眠阶段温柔地把你唤醒,让你如同自然醒般的舒适,醒后大脑能保持高效率运转。

runningcheese-gtd-07.png

 
不要总是想着再小睡一会儿 (其实就是赖床),那只会让你更加想睡,更加没法起床,咬咬牙告诉自己只要两分钟,两分钟我就能清醒了。就像一句话说的,你总想做一个优秀的人,做一些惊天动地的事,可是你连早点起床都做不到。如果是工作的原因没办法早睡早起,那也要让自己的作息时间规律起来,没办法做早睡早起的大公鸡,那就做晚睡晚起的猫头鹰。

更简洁的To-do List

To-do List对于时间管理的作用不言而喻,它能够让你明确接下来要做什么,先做什么,什么最重要,让你的工作更顺畅、有条理、更有紧迫感。比如,临睡前列出明天最重要的三件事,起床后就可以开始着手这三件事了。

Clear是一款方便快捷的轻量级To-do List应用,令人上耳目一新的设计和交互方式,只为用户提供待办事项列表,没有任何复杂的功能,可以各种手势对Clear进行操作,学习成本低,上手极快。

runningcheese-gtd-08.png

 
我的使用经验是: Clear主要用于偶然灵感的记录,简单的文字记录,短期事件的提醒(1-3天),还有就是购物清单,记录的原则是不要让Clear列表清单过于碎片化,判断是否能加入Clear列表采取两分钟原则,两分钟内能解决的事情,无论是何种事情,马上着手解决掉,如果不能再加入Clear列表。

日历行程表终结者

备忘录、日历和提醒事项是构成手机日历行程表的核心要素,备忘录主要用于记录文字或者用作粘贴板存放一些需要经常复制使用的东西。日历是以时间顺序为线索,将所有事件组织起来。提醒事项则一般是应该尽快完成的事情。提醒事项与日历中的添加事件很相似,最大的不同就是事件的组织形式,日历以时间顺序为线索,而提醒事项可以对事件性质进行分类,如可以分成工作、生活、学习等。所有有日期要求的事件,写入日历,没有具体日期要求的又是两分钟做不完的事件,写入提醒事项。会干扰你当天的工作重点的事件,写入日历,不会干扰你当天的工作重点的,属于未进行划分的工作,写入提醒事项。日历的事件尽可能要少,一旦设置就要认真按时完成,提醒事项一旦设置就要尽快完成, as soon as possible.

AwesomeNote是一款创新的笔记和待办事项管理应用,也是奶酪认为在iOS上最好的笔记应用,精美的界面,层次分明的文件夹分类,最重要的原因是它能同步原生日历和原生提醒,还能同步到Evernote (印象笔记),这使得AwesomeNote能够在手机端和电脑端同时使用,这很重要。
runningcheese-gtd-09.png


我的使用经验是: 日历和提醒事项使用手机原生工具,然后同步到AwesomeNote中,用Clear做短期计划,用AwesomeNote做记事本、有规律的循环事件、中期长期计划,包括:

日记 —— (标注格式为日记) 每天写的日记,我用的方法是问答式记录:今天学到了什么知识,是什么样的状态,有什么新闻,遇到了什么人,有什么进步和值得反省的事。旅行日记通常图片会比较多,我的选择是用百度网盘来保存。
纪念 —— (标注格式为纪念日) 家人朋友的生日和重要的纪念日,设定在该日期的前一天提醒你,然后送上你的祝福和惊喜吧。
待办 —— (标注格式为任务) 需要做计划去办的中期和长期事项,比如年度愿望清单,瘦身计划等。
原生日历 —— 日历的事件尽可能要少,一旦设置就要认真按时完成。
原生提醒事项 —— Clear用于短期(1-3天内)的事件提醒,原生提醒事项用于每月有规律的事件提醒。

优秀是一种习惯

古希腊哲学学亚里士多德说过 “优秀是一种习惯”,一些优秀的人之所以能够创造出令人瞩目的成就,是因为他们在日常生活、工作和学习中养成了各种各样良好的习惯。优秀是一种气质、优秀是一种状态、优秀更是一种习惯。一个人的习惯往往就是一个人性格的缩影, 我们的一言一行都是日积月累养成的习惯。如果说优秀是一种习惯,那么懒惰和平庸也是一种习惯。

Habit List是一款极简设计风格的习惯养成应用,界面精美,操作简单,直观的统计功能,还有灵活的周期设置功能,唯一的就是缺点是没办法跨平台使用。

runningcheese-gtd-10.png

 
好习惯的培养和坏习惯的改正都不会是轻而易举的,习惯养成需要循序渐进,由浅入深,由近及远,需要宁少勿多、宁简勿繁、宁易勿难。先找一个比较容易做到的,做起来有兴趣的,很快就能尝到甜头的,而且能不断受到自己和周围人激励的习惯开始,一个习惯如果坚持了21天就给自己一个奖励吧,如果没有坚持下来那就给自己一个小小的惩罚吧。

番茄能治拖延症

明明知道那件事必须要做了,可就是迟迟不能开始,再给两分钟培养培养工作情绪,然后拖拖拉拉了半小时,工作时随手刷刷朋友圈,结果把手上的工作给放下了,这就是 “如果还有明天,你的工作是永远没法做完”的原因。番茄工作法是简单易行的时间管理方法,在一个个短短的25分钟内,收获的不仅仅是效率,还会有意想不到的成就感。

pomotodo是一款结合了番茄工作法和To-do List的在线工具,多平台支持,可惜暂时没有Firefox拓展,是用电脑工作时番茄工作法的绝佳选择。操作方法很简单,首先规划好今天要完成的几个任务,选择其中的一个任务,设定番茄钟直到番茄钟响起(25分到),休息5分钟后(喝水、活动、回QQ,看手机信息都行),开始下一个番茄钟,每四个番茄钟后,休息25分钟。中断如果遇到非得马上做不可的事,那么停止这个番茄钟并宣告它作废,完成这件事情之后再重新开始同一个番茄钟,如果是不是必须马上去做的事,在列表里标记下来就可以了。 
runningcheese-gtd-11.png


Forest是一款创新性的应用,它创新性地将番茄工作法与种树的小游戏结合,当我们需要专注投入一件事情时,用Forest种下一棵树,其间Forest会默默倒计时监督用户不要碰手机,只有在不退出应用的情况下树才能成活,退出则会直接导致树木枯死,以勉励用户中途不要碰手机,旨在帮助用户戒掉“依赖手机”的坏毛病。

runningcheese-gtd-12.png

 
我认为的时间管理

我认为任何工作都应该要有计划,以明确目的,避免盲目,使得工作有条不紊,循序渐进。有计划的生活能让你的从容不迫地度过每一天,很多时候的压力来自于我们不知道自己接下来该干些什么。GTD时间管理可以帮助我们合理地安排时间,高效地提升工作效率,正确地应对工作,让我们成为时间的主人。但是,时间管理的目的并不只是为了在短时间之内做更多的事,让人机器人般工作。高效率和严谨地按计划行事固然好,但如果只是按部就班的话,我们的生活中可能会出现一些缺失的美好,我们应该发挥人的主观能动性,让我们的工作带有创造性。

所以,我认为的时间管理的是让生活「慢」一点,让你「没有压力」地去做一些自己喜欢的事,让你的「从容不迫」地度过每一天。

如何防止网页被加载在Frame中?

回复

前端开发zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4343 次浏览 • 2017-07-26 10:24 • 来自相关话题

软件架构设计之五视图方法论

架构思想zkbhj 发表了文章 • 0 个评论 • 1991 次浏览 • 2017-07-26 09:22 • 来自相关话题

1.每个人都可以做成为架构设计师

不懂软件的和刚入行的人们一听到架构设计,都认为是非常的高大上课题,是一个遥不可及的领域,一般人是不能做的。听起来云里雾里的,第一印象除了来自微软,阿里这些NB的公司里面的人其余的都不能做出架构似的,这是一种先入为主的思想,因为大家都在强调架构师的重要性,他的薪资有多么的高,在整个社会对他的认定导致很多人对架构设计望而生畏。放正自己的心态其实架构设计并没有多么的复杂。我们是从编码入行的,在编码实现功能的过程中我们或多或少的设计了属于自己的软件架构了。

为什么说软件架构师需要多少年的工作经验,因为软件架构就是系统的草图,不仅是代码编写而且包括部署,运行、开发等这些方面进行设计,目的是为了保证软件开发、运行、扩展、性能、安全、伸缩等等质量的一个保证。只要在编码过程中不仅仅要提升编码的质量而且要留心其他方面的知识积累与学习,用不了多久你也能成为一位优秀的架构设计师。

2.什么是架构设计

我们要成为架构设计师我们需要了解什么是架构设计。简单一点,架构设计就是一个系统的草图,描述了构成系统的抽象组件,以及各个组件之间的是如何进行通讯的,这些组件在实现过程中可以被细化为实际的组件比如类或者对象。在面向对象领域中,组件之间的联通通常面向于接口实现的。

在“软件架构简介”中David Garlan 和Mary Shaw 认为软件架构师有关如下问题进行设计的:“计算的算法和数据结构之外,设计并确定系统整体结构,结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。”

架构和结构会难以区分,明确一点架构不是结构,IEEE把架构定义为“系统在其环境中的最高层概念”架构还包括系统完整性、经济约束条件、审美需求和样式等。在Rational Unified Process 中对软件架构的解释:软件架构指系统重要构建的组织或结构,这些重要的构建通过接口与其他构建进行交互。

总体来说软件架构对软件从整体到部分的描述,从开发到运行再到后期扩展的描述,从性能和安全可靠性进行描述。

3.架构设计为了解决什么问题
开发之初逻辑设计阶段要确定系统如何开发,整个系统融合为一个系统开发还是从业务角度将系统拆分为几个独立的子系统。在即将进入开发的时候关注了数据是如何持久化的,以及数据库选型、以及非数据库文件的存储格式,等这些存储方案的确定。在开发过程中我们要关注如何保证开发质量,如何分层,代码可扩展性,使用的设计模式,依赖了那些框架,开发语言这些方向的确定。开发完成之后进入运行阶段,如何在架构设计的时候保证运行期间的质量属性、性能、可伸展性等,主要是系统运行进程的划分,以及进程之间通过线程来通信。同时如果系统并非是单机运行,还需考虑系统的物理部署,系统部署在那个服务器上,这些服务器配置性能怎样能否胜任系统的运行,操作系统选型,以及系统部署的网络拓扑图,还有就是保证数据安全的数据备份怎样设计的。

以上五个问题是从五个角度来确定架构以及架构设计需要解决的问题。

4.架构设计的五视图法

我们刚才从五个不同的角度知道架构设计需要解决的问题,那么使用五视图法就更加系统的分析设计我们架构了:











从这幅图里面我们可以看出架构设计五视图中各个角度需要解决的问题了,并且可以看出他们之间的联系了。

5.后期如何使用使用架构设计

无论多么好的架构如果只是为了设计完成任务都是毫无意义的,我们设计出来的架构无论是好或不好我们首先需要按照架构设计来完成系统的开发,作为项目的Leader就需要严格按照架构设计出来的标准进行检查,无论我们的开发模式敏不敏捷,到一定时间都有一个里程碑的阶段,到了这个阶段Leader牵头严格按照架构设计文档中相应的章节对开发出来的系统进行检查,及早发现问题及早解决,不要把问题向后面推。


1)物理架构
    物理架构的目的是确定物理节点和物理节点的拓扑结构;其中物理节点包括服务器、PC机、专用机、软件安装部署烧写以及系统软件的选型;拓扑结构明确物理节点的关系。

2)运行架构
    运行架构的目的是确定控制流和控制流的组织;其中控制流包括进程、线程、服务程序;控制流组织包括系统的启动与停机、控制流通讯、同步与加锁。

3)开发架构
    开发架构的目的是确定程序单元以及程序单元的组织结构;其中程序单元包括源文件、配置文件、程序库、框架、目标单元;程序单元组织包括project划分、project目录结构、编译依赖关系。

4)逻辑架构
    逻辑架构的目的是职责的划分,并明确其与协作关系;其中职责的划分注意逻辑的分层、子系统以及关键类的定义;协作的定义关注接口的定义与协作关系的明确。

5)数据模型
    数据架构的目的是确定要存储的数据以及存储格式;其中存储的数据可以是文件、关系数据库、实时数据库;存储格式包括文件格式、数据库图表。
 
来自:http://blog.csdn.net/degwei/ar ... 89444 查看全部
1.每个人都可以做成为架构设计师

不懂软件的和刚入行的人们一听到架构设计,都认为是非常的高大上课题,是一个遥不可及的领域,一般人是不能做的。听起来云里雾里的,第一印象除了来自微软,阿里这些NB的公司里面的人其余的都不能做出架构似的,这是一种先入为主的思想,因为大家都在强调架构师的重要性,他的薪资有多么的高,在整个社会对他的认定导致很多人对架构设计望而生畏。放正自己的心态其实架构设计并没有多么的复杂。我们是从编码入行的,在编码实现功能的过程中我们或多或少的设计了属于自己的软件架构了。

为什么说软件架构师需要多少年的工作经验,因为软件架构就是系统的草图,不仅是代码编写而且包括部署,运行、开发等这些方面进行设计,目的是为了保证软件开发、运行、扩展、性能、安全、伸缩等等质量的一个保证。只要在编码过程中不仅仅要提升编码的质量而且要留心其他方面的知识积累与学习,用不了多久你也能成为一位优秀的架构设计师。

2.什么是架构设计

我们要成为架构设计师我们需要了解什么是架构设计。简单一点,架构设计就是一个系统的草图,描述了构成系统的抽象组件,以及各个组件之间的是如何进行通讯的,这些组件在实现过程中可以被细化为实际的组件比如类或者对象。在面向对象领域中,组件之间的联通通常面向于接口实现的。

在“软件架构简介”中David Garlan 和Mary Shaw 认为软件架构师有关如下问题进行设计的:“计算的算法和数据结构之外,设计并确定系统整体结构,结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。”

架构和结构会难以区分,明确一点架构不是结构,IEEE把架构定义为“系统在其环境中的最高层概念”架构还包括系统完整性、经济约束条件、审美需求和样式等。在Rational Unified Process 中对软件架构的解释:软件架构指系统重要构建的组织或结构,这些重要的构建通过接口与其他构建进行交互。

总体来说软件架构对软件从整体到部分的描述,从开发到运行再到后期扩展的描述,从性能和安全可靠性进行描述。

3.架构设计为了解决什么问题
  1. 开发之初逻辑设计阶段要确定系统如何开发,整个系统融合为一个系统开发还是从业务角度将系统拆分为几个独立的子系统。
  2. 在即将进入开发的时候关注了数据是如何持久化的,以及数据库选型、以及非数据库文件的存储格式,等这些存储方案的确定。
  3. 在开发过程中我们要关注如何保证开发质量,如何分层,代码可扩展性,使用的设计模式,依赖了那些框架,开发语言这些方向的确定。
  4. 开发完成之后进入运行阶段,如何在架构设计的时候保证运行期间的质量属性、性能、可伸展性等,主要是系统运行进程的划分,以及进程之间通过线程来通信。
  5. 同时如果系统并非是单机运行,还需考虑系统的物理部署,系统部署在那个服务器上,这些服务器配置性能怎样能否胜任系统的运行,操作系统选型,以及系统部署的网络拓扑图,还有就是保证数据安全的数据备份怎样设计的。


以上五个问题是从五个角度来确定架构以及架构设计需要解决的问题。

4.架构设计的五视图法

我们刚才从五个不同的角度知道架构设计需要解决的问题,那么使用五视图法就更加系统的分析设计我们架构了:

20140605165523453.jpg


20140714164750902.jpg


从这幅图里面我们可以看出架构设计五视图中各个角度需要解决的问题了,并且可以看出他们之间的联系了。

5.后期如何使用使用架构设计

无论多么好的架构如果只是为了设计完成任务都是毫无意义的,我们设计出来的架构无论是好或不好我们首先需要按照架构设计来完成系统的开发,作为项目的Leader就需要严格按照架构设计出来的标准进行检查,无论我们的开发模式敏不敏捷,到一定时间都有一个里程碑的阶段,到了这个阶段Leader牵头严格按照架构设计文档中相应的章节对开发出来的系统进行检查,及早发现问题及早解决,不要把问题向后面推。


1)物理架构
    物理架构的目的是确定物理节点和物理节点的拓扑结构;其中物理节点包括服务器、PC机、专用机、软件安装部署烧写以及系统软件的选型;拓扑结构明确物理节点的关系。

2)运行架构
    运行架构的目的是确定控制流和控制流的组织;其中控制流包括进程、线程、服务程序;控制流组织包括系统的启动与停机、控制流通讯、同步与加锁。

3)开发架构
    开发架构的目的是确定程序单元以及程序单元的组织结构;其中程序单元包括源文件、配置文件、程序库、框架、目标单元;程序单元组织包括project划分、project目录结构、编译依赖关系。

4)逻辑架构
    逻辑架构的目的是职责的划分,并明确其与协作关系;其中职责的划分注意逻辑的分层、子系统以及关键类的定义;协作的定义关注接口的定义与协作关系的明确。

5)数据模型
    数据架构的目的是确定要存储的数据以及存储格式;其中存储的数据可以是文件、关系数据库、实时数据库;存储格式包括文件格式、数据库图表。
 
来自:http://blog.csdn.net/degwei/ar ... 89444

Nginx 配置文件 nginx.conf 详解

服务器zkbhj 发表了文章 • 0 个评论 • 1391 次浏览 • 2017-07-25 10:30 • 来自相关话题

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /var/log/nginx/ha97access.log access;

#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
} 查看全部
#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /var/log/nginx/ha97access.log access;

#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}

RPC 原理概述

架构思想zkbhj 发表了文章 • 0 个评论 • 1510 次浏览 • 2017-07-25 09:51 • 来自相关话题

踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:
1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用?
2)其它团队要使用我们的服务,我们的服务该怎么发布以便他人调用?下文我们将对这两个问题展开探讨。 
1 如何调用他人的远程服务?

由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。

要让网络通信细节对使用者透明,我们自然需要对通信细节进行封装,我们先看下一个RPC调用的流程:





 

1)服务消费方(client)调用以本地调用方式调用服务;
2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3)client stub找到服务地址,并将消息发送到服务端;
4)server stub收到消息后进行解码;
5)server stub根据解码结果调用本地的服务;
6)本地服务执行并将结果返回给server stub;
7)server stub将返回结果打包成消息并发送至消费方;
8)client stub接收到消息,并进行解码;
9)服务消费方得到最终结果。


RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。
  
1.2  怎么对消息进行编码和解码?
1.2.1 确定消息数据结构

上节讲了invoke里需要封装通信细节,而通信的第一步就是要确定客户端和服务端相互通信的消息结构。客户端的请求消息结构一般需要包括以下内容:

1)接口名称

在我们的例子里接口名是“HelloWorldService”,如果不传,服务端就不知道调用哪个接口了;

2)方法名

一个接口内可能有很多方法,如果不传方法名服务端也就不知道调用哪个方法;

3)参数类型&参数值

参数类型有很多,比如有bool、int、long、double、string、map、list,甚至如struct(class);

以及相应的参数值;

4)超时时间

5)requestID,标识唯一请求id,在下面一节会详细描述requestID的用处。

同理服务端返回的消息结构一般包括以下内容。

1)返回值

2)状态code

3)requestID

1.2.2 序列化

一旦确定了消息的数据结构后,下一步就是要考虑序列化与反序列化了。

什么是序列化?序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。

什么是反序列化?将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

为什么需要序列化?转换为二进制串后才好进行网络传输嘛!为什么需要反序列化?将二进制转换为对象才好进行后续处理!

现如今序列化的方案越来越多,每种序列化方案都有优点和缺点,它们在设计之初有自己独特的应用场景,那到底选择哪种呢?从RPC的角度上看,主要看三点:
1)通用性,比如是否能支持Map等复杂的数据结构;
2)性能,包括时间复杂度和空间复杂度,由于RPC框架将会被公司几乎所有服务使用,如果序列化上能节约一点时间,对整个公司的收益都将非常可观,同理如果序列化上能节约一点内存,网络带宽也能省下不少;
3)可扩展性,对互联网公司而言,业务变化快,如果序列化协议具有良好的可扩展性,支持自动增加新的业务字段,删除老的字段,而不影响老的服务,这将大大提供系统的健壮性。

目前国内各大互联网公司广泛使用hessian、protobuf、thrift、avro等成熟的序列化解决方案来搭建RPC框架,这些都是久经考验的解决方案。
  查看全部
踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:
1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用?
2)其它团队要使用我们的服务,我们的服务该怎么发布以便他人调用?下文我们将对这两个问题展开探讨。 
1 如何调用他人的远程服务?

由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。

要让网络通信细节对使用者透明,我们自然需要对通信细节进行封装,我们先看下一个RPC调用的流程:

522490-20151003120412386-363334260.png

 


1)服务消费方(client)调用以本地调用方式调用服务;
2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3)client stub找到服务地址,并将消息发送到服务端;
4)server stub收到消息后进行解码;
5)server stub根据解码结果调用本地的服务;
6)本地服务执行并将结果返回给server stub;
7)server stub将返回结果打包成消息并发送至消费方;
8)client stub接收到消息,并进行解码;
9)服务消费方得到最终结果。



RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。
  
1.2  怎么对消息进行编码和解码?
1.2.1 确定消息数据结构

上节讲了invoke里需要封装通信细节,而通信的第一步就是要确定客户端和服务端相互通信的消息结构。客户端的请求消息结构一般需要包括以下内容:

1)接口名称

在我们的例子里接口名是“HelloWorldService”,如果不传,服务端就不知道调用哪个接口了;

2)方法名

一个接口内可能有很多方法,如果不传方法名服务端也就不知道调用哪个方法;

3)参数类型&参数值

参数类型有很多,比如有bool、int、long、double、string、map、list,甚至如struct(class);

以及相应的参数值;

4)超时时间

5)requestID,标识唯一请求id,在下面一节会详细描述requestID的用处。

同理服务端返回的消息结构一般包括以下内容。

1)返回值

2)状态code

3)requestID

1.2.2 序列化

一旦确定了消息的数据结构后,下一步就是要考虑序列化与反序列化了。

什么是序列化?序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。

什么是反序列化?将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

为什么需要序列化?转换为二进制串后才好进行网络传输嘛!为什么需要反序列化?将二进制转换为对象才好进行后续处理!

现如今序列化的方案越来越多,每种序列化方案都有优点和缺点,它们在设计之初有自己独特的应用场景,那到底选择哪种呢?从RPC的角度上看,主要看三点:
1)通用性,比如是否能支持Map等复杂的数据结构;
2)性能,包括时间复杂度和空间复杂度,由于RPC框架将会被公司几乎所有服务使用,如果序列化上能节约一点时间,对整个公司的收益都将非常可观,同理如果序列化上能节约一点内存,网络带宽也能省下不少;
3)可扩展性,对互联网公司而言,业务变化快,如果序列化协议具有良好的可扩展性,支持自动增加新的业务字段,删除老的字段,而不影响老的服务,这将大大提供系统的健壮性。

目前国内各大互联网公司广泛使用hessian、protobuf、thrift、avro等成熟的序列化解决方案来搭建RPC框架,这些都是久经考验的解决方案。
 

PHP如何隐藏手机号或邮箱中间的内容用*代替?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2601 次浏览 • 2017-07-21 10:05 • 来自相关话题