屮回忆未来~ 23:46:10
招PHP开发人员,有合适的推荐.我顶。。。得了
流年 23:46:25
呵呵
屮回忆未来~ 23:47:03
我想问问现在php比较好的框架有那些值得推荐的啊。。?
谢谢
屮回忆未来~ 23:47:57
mambo如何?
流年 23:48:14
mambo不能算是框架,是一个应用系统
屮回忆未来~ 23:48:54
但是可以在他上面搞快速开发啊。。smarty呢?
流年 23:49:10
smarty只是一个模版引擎
屮回忆未来~ 23:49:30
那你认为好的框架是什么呢?请赐教
流年 23:49:44
首先你要明白什么是框架,呵呵
屮回忆未来~ 23:50:17
不明白喔。。。
屮回忆未来~ 23:50:24
讲讲嘛。。
流年 23:50:52
目前主流的php国外框架有zendframework cakephp和symfony,国内的有thinkphp和fleaphp
屮回忆未来~ 23:51:11
thinkphp,这个是你搞的吧。。(*^__^*) 嘻嘻……
流年 23:51:15
是的
流年 23:51:42
当然,可能还有很多小的,或者没有开源的,我说的都是开源的
屮回忆未来~ 23:52:07
你觉得你的thinkphp在高访问的情况下性能能行吗?瓶颈有没有啊
流年 23:52:24
那么你觉得zendframework可以吗?
屮回忆未来~ 23:53:16
没用过,zend的编辑器我觉得确实不错,但它的框架不知道喔。
流年 23:53:50
高并发和大流量的访问不是靠软件本身来承载的
屮回忆未来~ 23:54:28
考系统吗?我觉得应该把常用的数据cach起来,你有用c写php模块的资料没有呢?
流年 23:54:44
没有,缓存都是支持的
流年 23:55:50
但是怎么缓存,缓存什么,是应用要考虑的
屮回忆未来~ 23:58:37
很有道理。。。
屮回忆未来~ 23:59:06
其实很多时候都是以应用考虑,框架也就自己搭建了
屮回忆未来~ 00:00:23
你的框架我肯定看看。。。我觉得应该很好学吧,有没有上升到思想这个层面啊
流年 00:01:31
呵呵,你看过就知道了
屮回忆未来~ 00:02:13
www.liu21st.com现在还用吗?搞成thinkphp.cn了
流年 00:02:46
基本不用了
流年 00:02:55
只是维护thinkphp.cn
屮回忆未来~ 00:03:41
喔,我想在邮件系统采用你的框架,不知道是否成熟
屮回忆未来~ 00:03:54
webmail
流年 00:04:03
过两天就发布正式版本了
屮回忆未来~ 00:06:25
我建议把ldap操作也给php封装了。。
流年 00:06:43
封装是类库的事情,不是框架的事情
屮回忆未来~ 00:16:42
学习学习。。。
屮回忆未来~ 00:17:06
你的网站模板好像又改了,给一份好吗?
屮回忆未来~ 00:17:19
我的网站 www.happycun.com/blog
流年 00:17:45
你的模版不是很好麽
屮回忆未来~ 00:18:31
是你上次推荐的啊,我想搞成你那样的。。。觉得方便阅读,我这个太呆板了。三栏
流年 00:19:13
我的也是用其它网站的改的而已,样式这个东西你去找wp的模版大把了
屮回忆未来~ 00:25:21
好的。正式版本发了给小弟发一份好不?我想学习学习xdy108@126.com
屮回忆未来~ 00:25:31
招PHP开发人员,有合适的推荐.我顶。。。得了
流年 23:46:25
呵呵
屮回忆未来~ 23:47:03
我想问问现在php比较好的框架有那些值得推荐的啊。。?
谢谢
屮回忆未来~ 23:47:57
mambo如何?
流年 23:48:14
mambo不能算是框架,是一个应用系统
屮回忆未来~ 23:48:54
但是可以在他上面搞快速开发啊。。smarty呢?
流年 23:49:10
smarty只是一个模版引擎
屮回忆未来~ 23:49:30
那你认为好的框架是什么呢?请赐教
流年 23:49:44
首先你要明白什么是框架,呵呵
屮回忆未来~ 23:50:17
不明白喔。。。
屮回忆未来~ 23:50:24
讲讲嘛。。
流年 23:50:52
目前主流的php国外框架有zendframework cakephp和symfony,国内的有thinkphp和fleaphp
屮回忆未来~ 23:51:11
thinkphp,这个是你搞的吧。。(*^__^*) 嘻嘻……
流年 23:51:15
是的
流年 23:51:42
当然,可能还有很多小的,或者没有开源的,我说的都是开源的
屮回忆未来~ 23:52:07
你觉得你的thinkphp在高访问的情况下性能能行吗?瓶颈有没有啊
流年 23:52:24
那么你觉得zendframework可以吗?
屮回忆未来~ 23:53:16
没用过,zend的编辑器我觉得确实不错,但它的框架不知道喔。
流年 23:53:50
高并发和大流量的访问不是靠软件本身来承载的
屮回忆未来~ 23:54:28
考系统吗?我觉得应该把常用的数据cach起来,你有用c写php模块的资料没有呢?
流年 23:54:44
没有,缓存都是支持的
流年 23:55:50
但是怎么缓存,缓存什么,是应用要考虑的
屮回忆未来~ 23:58:37
很有道理。。。
屮回忆未来~ 23:59:06
其实很多时候都是以应用考虑,框架也就自己搭建了
屮回忆未来~ 00:00:23
你的框架我肯定看看。。。我觉得应该很好学吧,有没有上升到思想这个层面啊
流年 00:01:31
呵呵,你看过就知道了
屮回忆未来~ 00:02:13
www.liu21st.com现在还用吗?搞成thinkphp.cn了
流年 00:02:46
基本不用了
流年 00:02:55
只是维护thinkphp.cn
屮回忆未来~ 00:03:41
喔,我想在邮件系统采用你的框架,不知道是否成熟
屮回忆未来~ 00:03:54
webmail
流年 00:04:03
过两天就发布正式版本了
屮回忆未来~ 00:06:25
我建议把ldap操作也给php封装了。。
流年 00:06:43
封装是类库的事情,不是框架的事情
屮回忆未来~ 00:16:42
学习学习。。。
屮回忆未来~ 00:17:06
你的网站模板好像又改了,给一份好吗?
屮回忆未来~ 00:17:19
我的网站 www.happycun.com/blog
流年 00:17:45
你的模版不是很好麽
屮回忆未来~ 00:18:31
是你上次推荐的啊,我想搞成你那样的。。。觉得方便阅读,我这个太呆板了。三栏
流年 00:19:13
我的也是用其它网站的改的而已,样式这个东西你去找wp的模版大把了
屮回忆未来~ 00:25:21
好的。正式版本发了给小弟发一份好不?我想学习学习xdy108@126.com
屮回忆未来~ 00:25:31
什么是妻子?就是你愿意把积蓄交给她保管的女人。什么是情人?就是你偷偷摸摸地去和她约会又怕妻子撞见的女人。什么是红颜知己?就是你能把有些秘密说给她听却不能说给妻子听的女人。
妻子是一种约束,约束你不能随便和别的女人交往;情人是一种补偿,补偿你想从妻子那得到却又无法得到的激情;红颜知己就是一种点拨,点拨你心中的迷津。
妻子陪你过日子,情人陪你花钞票,红颜知己陪你聊聊天。妻子不能替代情人,因为她没有情人有情调;情人不能代替妻子,因为她没有妻子的亲情;妻子和情人都代替不了红颜知己,那是心灵的需要。
妻子是一个和你没有一点血缘关系的女人,却为你深夜不回家而牵肠挂肚;情人是一个和你没有一点家庭关系的女人,却让你尝尽做男人滋味尽情销魂;红颜知己是一个还没和你扯上关系的女人,却能分担你的快乐和忧愁。
妻子是一个家,是一个能给你浮躁的心带来安抚的港湾;情人是家的累赘,只是不到万不得已你不想甩掉;红颜知己是家的点缀,没有她你不会觉得寂寞,但你会觉得生活没意思。
妻子的关心像一杯白开水,有时会成为一种唠叨,只是在生病时才成为一种温馨;情人的关心就像在白开水里加了一勺糖,慢慢地品上一个晚上还不满足;红颜知己的关心就像工作到午夜喝一杯咖啡,越喝越提神。
妻子怀上你的孩子会深情地问你想要个男孩还是要个女孩,情人怀上你的孩子会哭着来问你该怎么办啊?对于红颜知己,你会把你的情人怀孕的消息告诉她,并问她你该怎么办。至于妻子,你会在她发现你的情人肚子大了的秘密后才告诉她:“其实,我早就想告诉你了。”然后拼命地向她解释,并作可怜状。
妻子回了娘家一个星期不回来你也不想,情人三天不见你就给她打电话:上哪去了?今晚我们到老地方喝杯咖啡好吗?心中有了苦闷,你最想找个红颜知己倾诉,告诉她你在妻子和情人之间疲于奔命,实在受不了了。
最让男人受不了的是妻子的唠叨,情人的眼泪,红颜知己的误解。妻子的唠叨使男人的心乱上加乱,情人的眼泪让男人已硬的心变得酥软,红颜知己的误解把男人的心由悬崖推进深谷。
最好的妻子,就是男人能从她身上找到情人和红颜知己两种相互交织的感觉,只是这种感觉男人很难找到。最好的情人是在你和她的关系被妻子发现而主动退出又不提任何要求,只是情人很难做到这点。最好的红颜知己是有一天她能成为情人,甚至妻子,只是这种想法很难实现。
如果有可能,男人都在想把红颜知己变成情人,如果再有可能,再把她变成妻子。只是变成妻子的红颜知己就不再是知己了,因为很少有男人把自己的妻子当成知己的。男人心中有好多秘密不能随便说给妻子听。要不,那还叫男人么?
娶一个妻子是为了怕别人说闲话,找一个情人是为了给单调的生活加点味精,交一个红颜知己是想给空虚的心灵浇点鸡汤。男人一生都在寻找的不是一个妻子,也不是一个情人,而是一个甚至更多的红颜知己。
有些失去是注定的,有些缘分是永远不会有结果的,爱一个人不一定要拥有,但拥有了一个人就一定要珍惜,不要等到伤害的时候才去乞求原谅,不要等到失去的时候再去挽回。如果我不小心流下一滴泪水,那是因为我不愿意忘记你是谁
妻子是一种约束,约束你不能随便和别的女人交往;情人是一种补偿,补偿你想从妻子那得到却又无法得到的激情;红颜知己就是一种点拨,点拨你心中的迷津。
妻子陪你过日子,情人陪你花钞票,红颜知己陪你聊聊天。妻子不能替代情人,因为她没有情人有情调;情人不能代替妻子,因为她没有妻子的亲情;妻子和情人都代替不了红颜知己,那是心灵的需要。
妻子是一个和你没有一点血缘关系的女人,却为你深夜不回家而牵肠挂肚;情人是一个和你没有一点家庭关系的女人,却让你尝尽做男人滋味尽情销魂;红颜知己是一个还没和你扯上关系的女人,却能分担你的快乐和忧愁。
妻子是一个家,是一个能给你浮躁的心带来安抚的港湾;情人是家的累赘,只是不到万不得已你不想甩掉;红颜知己是家的点缀,没有她你不会觉得寂寞,但你会觉得生活没意思。
妻子的关心像一杯白开水,有时会成为一种唠叨,只是在生病时才成为一种温馨;情人的关心就像在白开水里加了一勺糖,慢慢地品上一个晚上还不满足;红颜知己的关心就像工作到午夜喝一杯咖啡,越喝越提神。
妻子怀上你的孩子会深情地问你想要个男孩还是要个女孩,情人怀上你的孩子会哭着来问你该怎么办啊?对于红颜知己,你会把你的情人怀孕的消息告诉她,并问她你该怎么办。至于妻子,你会在她发现你的情人肚子大了的秘密后才告诉她:“其实,我早就想告诉你了。”然后拼命地向她解释,并作可怜状。
妻子回了娘家一个星期不回来你也不想,情人三天不见你就给她打电话:上哪去了?今晚我们到老地方喝杯咖啡好吗?心中有了苦闷,你最想找个红颜知己倾诉,告诉她你在妻子和情人之间疲于奔命,实在受不了了。
最让男人受不了的是妻子的唠叨,情人的眼泪,红颜知己的误解。妻子的唠叨使男人的心乱上加乱,情人的眼泪让男人已硬的心变得酥软,红颜知己的误解把男人的心由悬崖推进深谷。
最好的妻子,就是男人能从她身上找到情人和红颜知己两种相互交织的感觉,只是这种感觉男人很难找到。最好的情人是在你和她的关系被妻子发现而主动退出又不提任何要求,只是情人很难做到这点。最好的红颜知己是有一天她能成为情人,甚至妻子,只是这种想法很难实现。
如果有可能,男人都在想把红颜知己变成情人,如果再有可能,再把她变成妻子。只是变成妻子的红颜知己就不再是知己了,因为很少有男人把自己的妻子当成知己的。男人心中有好多秘密不能随便说给妻子听。要不,那还叫男人么?
娶一个妻子是为了怕别人说闲话,找一个情人是为了给单调的生活加点味精,交一个红颜知己是想给空虚的心灵浇点鸡汤。男人一生都在寻找的不是一个妻子,也不是一个情人,而是一个甚至更多的红颜知己。
有些失去是注定的,有些缘分是永远不会有结果的,爱一个人不一定要拥有,但拥有了一个人就一定要珍惜,不要等到伤害的时候才去乞求原谅,不要等到失去的时候再去挽回。如果我不小心流下一滴泪水,那是因为我不愿意忘记你是谁
转自IT168 觉得对框架的认识和定位很有帮助,虽然讲的不是php,但是思想是一致的。
1 空前繁荣的开源世界
大致2000年以前,Java世界还是Sun一言九鼎,唯我独尊的时代。Sun发布的任何规范和标准都无一例外地被Java社区有意无意的追捧着,Java世界沉浸在一片歌功颂德,前拥后簇的氛围里。IBM,Bea,Oracle这些Java阵营的代表者也都为能最先最快实现Sun的各种规范而弹冠相庆。
但这三四年来,Java的列车驶进了春秋战国百家争鸣,百花齐放的时代, Apache,JBoss,opensymphony,Eclipse,Codehaus等开源组织个个门庭若市,车水马龙。Java世界似乎天天在过年——张灯结彩,新桃换旧符。打开theserverside.com网站,每天映入眼帘是一条条各种开源项目发布、升级的新闻。虽然嘈杂了些,但却异彩纷呈,惊艳四座。在Java世界里,十室之内必有隐士,十步之内必有芳草,有才华的程序员太多了,抑或怀才的程序员被独裁式的统治压抑太久了,一旦找到了海德公园,庞涓、孙膑、苏秦、张仪式的高手纷纷走出隐居的鬼谷,在开源舞台上劲舞一支,高歌一曲,用一个个开源项目彰显着自己独特的魅力。
从客户端到数据库,从页面流程控制到业务流程控制,从全文搜索到地图搜索,从论坛到博客,在各种应用领域你都可以方便地找到多个相似的Java开源框架。开源框架的空前繁荣有力的促进了Java技术的交流和分享。一些面向开源的社区,论坛纷纷建立,国内比较著名的就有满江红开源论坛、中文Spring论坛、JavaScud开源平台、JavaEye社区等,宣讲、争论、协作、互动,无数激情和智慧碰撞出耀眼的火花。
随着开源项目的日益增多,国内甚至出现了象open-open.com Java开源大全的汇总整理网站,它如一个开源项目的大集市,将开源项目分类整理,提供简要的描述说明信息,方便使用者了解、查询和比较。
开源项目的繁荣还为技术图书业创造了机会,不管是国外的Amazon,还是china-pub或dearbook,开源框架或产品的技术图书,如Spring,Hibernate,Struts,Eclipse等等都成为荣登榜首的畅销先锋。
这场几乎来源于民间的开源飓风给开发者和CTO们的思路和决策带来了巨大的影响,据Bea的调查,全球排名前2000家软件开发公司中有70%以上在使用一种或多种开源框架——多达28%的公司在开发环境中使用了一种以上的应用服务器。
同时开源也给走传统路线的Java巨头们带来战略性的影响:Sun去年宣布将其旗舰产品——Solaris开源;去年IBM向第三方厂商开放了其高性能通用并行文件系统(GPFS)的源代码;Unisys也改变企业战略定位投入开源怀抱等等不胜枚举,它们纷纷将营利模式从原来的产品销售调整为支持与服务。
2 开源框架带来的烦恼
虽然开源的框架、类库越来越丰富,可供选择的替代者越来越多,但Java程序员却感觉自己慢慢陷入到了技术的漩涡之中:因为他们发现只要一段时间不关注开源社区,就有潮水般陌生的技术框架、专业术语、英文缩略词挟裹着一团团亢奋的热浪将自己淹没,让他们觉得随时都有被Java世界抛弃的危险。许多年纪稍大的程序员甚至觉得职位转换,甩掉技术干管理已经时不我待。
选择的困惑
雨后春笋般涌现的开源框架都声称自己是最好的,有过多次因盲从于技术鼓吹而失望伤心的经历后,现在的开发者都变得成熟理智了,他们不会轻易相信某个框架自身的承诺,不会轻易附和他人的宣传,这确实是件好事。为了作出理智的选择,他们往往要自己亲自摸索以做出评判。
有时,我们会发现向上司推荐一个框架已经变成一件困难的事情,因为上司会冒出各种各样的问题:如Webwork比Struts好在哪里?Hibernate和iBatis有什么区别?OpenWFE比之jBpm有什么优势等等。所以要确定一个框架时,往往需要将相似的框架都研究一遍,以便有充足的理由让上司相信我们的选择是最优的。
但是,要将同类的框架都做一次研究并比较优劣并非易事,如开源工作流引擎就有Willow,OpenWFE,jBpm,Werkflow,OSWorkflow等不下30余种的框架,炫耀的声音一个比一个响亮。每种框架都有自己的设计思路和实现方案,况且这种技术预研性的工作,又不可能在项目周期内占用太多的时间,而不深入预研又不可能客观地作出评判,所以往往是熬红的双眼依然带着迷茫的目光。
此外,用人单位为了减少新员工的培训时间,对求职者往往有明确的框架使用技能和经验的要求。求职者为了能找到一个好工作,不得不逼迫自己学习更多的框架,以便让自己拥有更多的求职机会。
搭配的困难
开源的繁荣虽然给各个领域都造就了许多优秀的框架,如Spring,Struts,Hibernate,Lucene、OSCache等等,但却没有出现一个一站式,统管全局的整合开发框架。开发者在享用大餐之前,事先得充当大橱的角色,将这些盐,油、酱、菜按合理的方式调配好。
虽然,我们一直强调整体大于单个的总和,但是如何将单个“个体”正确的组合成发挥更大效应的“整体”却并非易事。因为这些单独的框架都由不同的团队开发,框架与框架之间存在天然的阻抗,这种框架和框架之间的“代沟”需要额外配置和编码才能弥合。
每个框架都拥有自己的配置文件,框架的整合经常带来配置的灾难,如将Spring和Struts整合时,不仅Struts本身的配置文件一个不能少,在Spring中还需要每个Action提供配置信息,而且两者需要遵守一定的契约。
相互搭配的框架和框架之间经常会出现相似的或重复的功能,如何取舍,如何使用往往让开发者们为难。如Spring本身提供了AOP方法返回结果的缓存功能,而Hibernate本身也提供二级缓存,究竟两者都使用呢,还是择一而从?往往中间又会引出很多争论。
框架整合的问题已经日益突出,我们可以在各开源论坛或社区发现大量有关讨论的主题。目前也出现了一些试图解决的框架整合问题的开源项目,如国外的AppFuse,国内的SpringSide,为框架的整合提供了专业的指导。但是并没有很好的解决现实开发中的实际需要。这些整合框架为了增加通用性,网都撒得太大,导致整合框架本身象一个庞然大物,让人望而生畏,定制性和灵巧性上都存在不足,降低了它们的实用性,所以这些整合性的开源项目往往降格为指导性的实例。
升级的困扰
活跃的框架每天都在升级改造,丰富功能。其次由于开源框架在一定程度上存在随意性,往往导致框架在实际使用后,发现大量隐含的Bug,所以有时对某个框架的升级变得不可避免。开源框架比之Sun正规的规范有着更加灵活的升级方式,高低版本不兼容的问题已经成为司空见惯的事情。如著名的Hibernate,其3.0版本和2.0版本的包名都发生了彻底的变化,刚发布的Acegi和低版本也存在很大的差异,无法兼容。
一个整合性的框架由多个出自于不同团队的框架组成,整合框架在这些组合框架之上高位运行,底层框架的升级变化就造成了组合框架水涨船高的局面,整合框架脆弱的稳定性很容易被打破。
组合框架的升级还直接带来了开发团队学习的压力,为了熟悉框架新功能和改进,在开发工作之余,他们不得不努力压榨自己的业余时间不断地充电学习。总是某个框架新功能学习还未完成,另一个框架的新版本又在一阵欢呼声中闪亮登场,让开发人员发现自己所有的努力只是一场骑牛追马游戏。
3 开发者如何走出迷局
框架的爆炸性增长和技术更替一日千里的速度,让刚刚从传统J2EE迷局中走出来的开发者重新堕入了新的困境之中。有许多切身体验的开发者在网上大倒苦水,甚至有许多声音在呐喊,希望重新回到JSP+JavaBean+JDBC那个纯真的年代中去。
框架的作者们本想还软件开发一个清新美满的世界,不想个体性的良性企盼变成了一种整体性的混乱纷争。在纷繁复杂的开源世界如何走出迷局和困境,把握自己技术航船的方向,是每个开发者们冥思遐想的事情。
重点学习 触类旁通
每个人的时间是有限的,对于周期紧,进度急,加班赶的开发者来说更加如此,使得开发者不可能 “识遍天下字,读尽人间书”逐个学习框架。选择好适合自己、适合项目的框架进行重点学习尤为重要。不但要掌握技术细节,更要理解框架的原理和思想,这样在接触相关框架时,我们才能触类旁通,慧眼识真。
如果你深入理解了Struts框架的MVC的原理和思想,在接触Tapestry,Spring MVC等框架时,你会发现两者只是形上的区别,而非质上的差异,即使因现实需要确实要转换框架时,也可以轻松平滑地过渡。
不求最好 但求适用
开发人员往往都是完美主义者,吹毛求疵,带着浓重的偏执狂倾向。是的,偏执狂是优秀程序员的一个特点,时下《只有偏执狂才能生存》也正在大卖热卖,Rod Johnson,Gavin King,Oberg也都是偏执狂。
但在有进度工期压力的情况下,我们不得不向实现妥协。对于公司来说,利润永远都是第一位的,不管用不用框架或用什么框架,只要能如期保质保量完成用户的所有功能需求,就是最好的项目。客户永远看不到,也不关心你使用了哪个优秀的技术和框架。
所以,在实际的开发中,也许我们常常需要委曲内心的冲动,只要目前的框架能满足需求,我们没有必须象服装界一样赶追时髦,一切不求最好,但求适用。
如果Spring Template JDBC已经很好的满足了目前的需求,就没有必要一定要上Hibernate,如果自己开发的简要列表控件效果不错,就无须转换为ExtremeTable。新框架的学习需要代价,但这种代价的价值在实际发挥功效之前是不被肯定的。况且看似不合时宜的那些简单而古老的技术也可以做出强大的系统,如世界上最大的java项目——巴西全国医疗系统,就是构建在JSP+JavaBean+Servlet之上。
注重积累 搭建平台
我们常常发现一些软件公司自身没有任何积累,完全寄希望于这些整合框架解决所有的问题。开源框架解决的都是某个领域的通用性问题,每个公司由于其所处行业,服务用户的不同,要求公司拥有自己的解决方案,框架的通用性和公司的个性化需求是存在矛盾的。软件公司应该加强自身的积累,在这些框架的基础上搭建好符合自身需求的快速开发平台,屏蔽掉底层框架的复杂功能和细枝末节,降低对开发人员的技能要求,以便新员工能够快速参与到项目中,而无需进行一个个开源框架的学习。
虽然这种积累和平台的建设会耗费额外的工作量,但首先它是一个循序渐进的过程,其次这种任务仅由两三个技术突出的技术人员承担,带来的好处是直接降低了其他开发人员使用难度和技术要求,在一定程序上避免了开源框架的所带来的不稳定性影响。
4 小结
开源的繁荣带来了丰富的框架,有力的推动了业界的发展,同时我们也看到,这种繁荣所带来的惊喜背后紧跟着许多困惑的眼神,迷失在繁荣的混乱之中的开发者们希望走出困惑,走出迷局。
如何在嘈杂喧闹的开源世界把握方向寻求突破,不管是对于开发者还是软件公司的决策者都值得深深的思考。
1 空前繁荣的开源世界
大致2000年以前,Java世界还是Sun一言九鼎,唯我独尊的时代。Sun发布的任何规范和标准都无一例外地被Java社区有意无意的追捧着,Java世界沉浸在一片歌功颂德,前拥后簇的氛围里。IBM,Bea,Oracle这些Java阵营的代表者也都为能最先最快实现Sun的各种规范而弹冠相庆。
但这三四年来,Java的列车驶进了春秋战国百家争鸣,百花齐放的时代, Apache,JBoss,opensymphony,Eclipse,Codehaus等开源组织个个门庭若市,车水马龙。Java世界似乎天天在过年——张灯结彩,新桃换旧符。打开theserverside.com网站,每天映入眼帘是一条条各种开源项目发布、升级的新闻。虽然嘈杂了些,但却异彩纷呈,惊艳四座。在Java世界里,十室之内必有隐士,十步之内必有芳草,有才华的程序员太多了,抑或怀才的程序员被独裁式的统治压抑太久了,一旦找到了海德公园,庞涓、孙膑、苏秦、张仪式的高手纷纷走出隐居的鬼谷,在开源舞台上劲舞一支,高歌一曲,用一个个开源项目彰显着自己独特的魅力。
从客户端到数据库,从页面流程控制到业务流程控制,从全文搜索到地图搜索,从论坛到博客,在各种应用领域你都可以方便地找到多个相似的Java开源框架。开源框架的空前繁荣有力的促进了Java技术的交流和分享。一些面向开源的社区,论坛纷纷建立,国内比较著名的就有满江红开源论坛、中文Spring论坛、JavaScud开源平台、JavaEye社区等,宣讲、争论、协作、互动,无数激情和智慧碰撞出耀眼的火花。
随着开源项目的日益增多,国内甚至出现了象open-open.com Java开源大全的汇总整理网站,它如一个开源项目的大集市,将开源项目分类整理,提供简要的描述说明信息,方便使用者了解、查询和比较。
开源项目的繁荣还为技术图书业创造了机会,不管是国外的Amazon,还是china-pub或dearbook,开源框架或产品的技术图书,如Spring,Hibernate,Struts,Eclipse等等都成为荣登榜首的畅销先锋。
这场几乎来源于民间的开源飓风给开发者和CTO们的思路和决策带来了巨大的影响,据Bea的调查,全球排名前2000家软件开发公司中有70%以上在使用一种或多种开源框架——多达28%的公司在开发环境中使用了一种以上的应用服务器。
同时开源也给走传统路线的Java巨头们带来战略性的影响:Sun去年宣布将其旗舰产品——Solaris开源;去年IBM向第三方厂商开放了其高性能通用并行文件系统(GPFS)的源代码;Unisys也改变企业战略定位投入开源怀抱等等不胜枚举,它们纷纷将营利模式从原来的产品销售调整为支持与服务。
2 开源框架带来的烦恼
虽然开源的框架、类库越来越丰富,可供选择的替代者越来越多,但Java程序员却感觉自己慢慢陷入到了技术的漩涡之中:因为他们发现只要一段时间不关注开源社区,就有潮水般陌生的技术框架、专业术语、英文缩略词挟裹着一团团亢奋的热浪将自己淹没,让他们觉得随时都有被Java世界抛弃的危险。许多年纪稍大的程序员甚至觉得职位转换,甩掉技术干管理已经时不我待。
选择的困惑
雨后春笋般涌现的开源框架都声称自己是最好的,有过多次因盲从于技术鼓吹而失望伤心的经历后,现在的开发者都变得成熟理智了,他们不会轻易相信某个框架自身的承诺,不会轻易附和他人的宣传,这确实是件好事。为了作出理智的选择,他们往往要自己亲自摸索以做出评判。
有时,我们会发现向上司推荐一个框架已经变成一件困难的事情,因为上司会冒出各种各样的问题:如Webwork比Struts好在哪里?Hibernate和iBatis有什么区别?OpenWFE比之jBpm有什么优势等等。所以要确定一个框架时,往往需要将相似的框架都研究一遍,以便有充足的理由让上司相信我们的选择是最优的。
但是,要将同类的框架都做一次研究并比较优劣并非易事,如开源工作流引擎就有Willow,OpenWFE,jBpm,Werkflow,OSWorkflow等不下30余种的框架,炫耀的声音一个比一个响亮。每种框架都有自己的设计思路和实现方案,况且这种技术预研性的工作,又不可能在项目周期内占用太多的时间,而不深入预研又不可能客观地作出评判,所以往往是熬红的双眼依然带着迷茫的目光。
此外,用人单位为了减少新员工的培训时间,对求职者往往有明确的框架使用技能和经验的要求。求职者为了能找到一个好工作,不得不逼迫自己学习更多的框架,以便让自己拥有更多的求职机会。
搭配的困难
开源的繁荣虽然给各个领域都造就了许多优秀的框架,如Spring,Struts,Hibernate,Lucene、OSCache等等,但却没有出现一个一站式,统管全局的整合开发框架。开发者在享用大餐之前,事先得充当大橱的角色,将这些盐,油、酱、菜按合理的方式调配好。
虽然,我们一直强调整体大于单个的总和,但是如何将单个“个体”正确的组合成发挥更大效应的“整体”却并非易事。因为这些单独的框架都由不同的团队开发,框架与框架之间存在天然的阻抗,这种框架和框架之间的“代沟”需要额外配置和编码才能弥合。
每个框架都拥有自己的配置文件,框架的整合经常带来配置的灾难,如将Spring和Struts整合时,不仅Struts本身的配置文件一个不能少,在Spring中还需要每个Action提供配置信息,而且两者需要遵守一定的契约。
相互搭配的框架和框架之间经常会出现相似的或重复的功能,如何取舍,如何使用往往让开发者们为难。如Spring本身提供了AOP方法返回结果的缓存功能,而Hibernate本身也提供二级缓存,究竟两者都使用呢,还是择一而从?往往中间又会引出很多争论。
框架整合的问题已经日益突出,我们可以在各开源论坛或社区发现大量有关讨论的主题。目前也出现了一些试图解决的框架整合问题的开源项目,如国外的AppFuse,国内的SpringSide,为框架的整合提供了专业的指导。但是并没有很好的解决现实开发中的实际需要。这些整合框架为了增加通用性,网都撒得太大,导致整合框架本身象一个庞然大物,让人望而生畏,定制性和灵巧性上都存在不足,降低了它们的实用性,所以这些整合性的开源项目往往降格为指导性的实例。
升级的困扰
活跃的框架每天都在升级改造,丰富功能。其次由于开源框架在一定程度上存在随意性,往往导致框架在实际使用后,发现大量隐含的Bug,所以有时对某个框架的升级变得不可避免。开源框架比之Sun正规的规范有着更加灵活的升级方式,高低版本不兼容的问题已经成为司空见惯的事情。如著名的Hibernate,其3.0版本和2.0版本的包名都发生了彻底的变化,刚发布的Acegi和低版本也存在很大的差异,无法兼容。
一个整合性的框架由多个出自于不同团队的框架组成,整合框架在这些组合框架之上高位运行,底层框架的升级变化就造成了组合框架水涨船高的局面,整合框架脆弱的稳定性很容易被打破。
组合框架的升级还直接带来了开发团队学习的压力,为了熟悉框架新功能和改进,在开发工作之余,他们不得不努力压榨自己的业余时间不断地充电学习。总是某个框架新功能学习还未完成,另一个框架的新版本又在一阵欢呼声中闪亮登场,让开发人员发现自己所有的努力只是一场骑牛追马游戏。
3 开发者如何走出迷局
框架的爆炸性增长和技术更替一日千里的速度,让刚刚从传统J2EE迷局中走出来的开发者重新堕入了新的困境之中。有许多切身体验的开发者在网上大倒苦水,甚至有许多声音在呐喊,希望重新回到JSP+JavaBean+JDBC那个纯真的年代中去。
框架的作者们本想还软件开发一个清新美满的世界,不想个体性的良性企盼变成了一种整体性的混乱纷争。在纷繁复杂的开源世界如何走出迷局和困境,把握自己技术航船的方向,是每个开发者们冥思遐想的事情。
重点学习 触类旁通
每个人的时间是有限的,对于周期紧,进度急,加班赶的开发者来说更加如此,使得开发者不可能 “识遍天下字,读尽人间书”逐个学习框架。选择好适合自己、适合项目的框架进行重点学习尤为重要。不但要掌握技术细节,更要理解框架的原理和思想,这样在接触相关框架时,我们才能触类旁通,慧眼识真。
如果你深入理解了Struts框架的MVC的原理和思想,在接触Tapestry,Spring MVC等框架时,你会发现两者只是形上的区别,而非质上的差异,即使因现实需要确实要转换框架时,也可以轻松平滑地过渡。
不求最好 但求适用
开发人员往往都是完美主义者,吹毛求疵,带着浓重的偏执狂倾向。是的,偏执狂是优秀程序员的一个特点,时下《只有偏执狂才能生存》也正在大卖热卖,Rod Johnson,Gavin King,Oberg也都是偏执狂。
但在有进度工期压力的情况下,我们不得不向实现妥协。对于公司来说,利润永远都是第一位的,不管用不用框架或用什么框架,只要能如期保质保量完成用户的所有功能需求,就是最好的项目。客户永远看不到,也不关心你使用了哪个优秀的技术和框架。
所以,在实际的开发中,也许我们常常需要委曲内心的冲动,只要目前的框架能满足需求,我们没有必须象服装界一样赶追时髦,一切不求最好,但求适用。
如果Spring Template JDBC已经很好的满足了目前的需求,就没有必要一定要上Hibernate,如果自己开发的简要列表控件效果不错,就无须转换为ExtremeTable。新框架的学习需要代价,但这种代价的价值在实际发挥功效之前是不被肯定的。况且看似不合时宜的那些简单而古老的技术也可以做出强大的系统,如世界上最大的java项目——巴西全国医疗系统,就是构建在JSP+JavaBean+Servlet之上。
注重积累 搭建平台
我们常常发现一些软件公司自身没有任何积累,完全寄希望于这些整合框架解决所有的问题。开源框架解决的都是某个领域的通用性问题,每个公司由于其所处行业,服务用户的不同,要求公司拥有自己的解决方案,框架的通用性和公司的个性化需求是存在矛盾的。软件公司应该加强自身的积累,在这些框架的基础上搭建好符合自身需求的快速开发平台,屏蔽掉底层框架的复杂功能和细枝末节,降低对开发人员的技能要求,以便新员工能够快速参与到项目中,而无需进行一个个开源框架的学习。
虽然这种积累和平台的建设会耗费额外的工作量,但首先它是一个循序渐进的过程,其次这种任务仅由两三个技术突出的技术人员承担,带来的好处是直接降低了其他开发人员使用难度和技术要求,在一定程序上避免了开源框架的所带来的不稳定性影响。
4 小结
开源的繁荣带来了丰富的框架,有力的推动了业界的发展,同时我们也看到,这种繁荣所带来的惊喜背后紧跟着许多困惑的眼神,迷失在繁荣的混乱之中的开发者们希望走出困惑,走出迷局。
如何在嘈杂喧闹的开源世界把握方向寻求突破,不管是对于开发者还是软件公司的决策者都值得深深的思考。
修改字段存储类型:
最常用同步关于库权限查询指令,基础预备:查一下数据库有用户及权限:
select distinct concat('user: ''',user,'''@''',host,''';') as query from mysql.user;
=================================================================
mysql> show create database jackxiang_mysql;
+-----------------+----------------------------------------------------------------------------+
| Database | Create Database |
+-----------------+----------------------------------------------------------------------------+
| jackxiang_mysql | CREATE DATABASE `jackxiang_mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+-----------------+----------------------------------------------------------------------------+
依葫芦画瓢:
建表基本结构都有:
如果是字符串的 NOT NULL DEFAULT '';
如果是数字型的 NOT NULL DEFAULT 0;
有兄弟说default '' 跨库也麻烦,不如default null:
用is null 和 ='' 都无法全部查询出来,有些人写程序,很容易把默认null的字段 插入成'',但是默认的很多数据又是null,这样一个字段会有 ''和null同时存在。
在上面表中加个索引:
Default值设定及Null设定
字符串:
alter table t_tst_root add busiLevel varchar(255) default '' not null after f_Id;
Int整形:
alter table t_tst_root add f_TstProjId int(10) default 0 not null after f_Id;
ALTER TABLE `Tbl_File` ADD PRIMARY KEY ( `FFileId` )
ALTER TABLE `Tbl_File` CHANGE `FFileId` `FFileId` INT( 11 ) NOT NULL AUTO_INCREMENT
________________________________________________________________________________________________
ALTER TABLE `temperatureone` CHANGE `nowTempValue` `nowTempValue` FLOAT(5,2) NOT NULL COMMENT '现在温度'
PHPMyadmin:
字段 nowTempValue
类型 FLOAT
长度/值*1 5,2
________________________________________________________________________________________________
alter table test add index id(id); //id不能有引号
加一个字段:
如果想要添加在某个字段的后面则是这样的:
想要修改一个字段及默认值:
把字段由text类似修改为var_char类型(我的bo-blog,里的字段作优化,bo-blog不更新了,自己作如下优化):
mysql里的长度简述:
CHAR(M) 0<M<=255(建议CHAR(1)外,超过此长度的用VARCHAR) M个字符(所占空间跟字符集等有关系)
VARCHAR(M) 0<M<65532/N M个字符(N大小由字符集,以及是否为中文还是字母数字等有关系)
TEXT 64K个字符 所占空间跟字符集等有关系
想删除某个字段:
添加索引、删除索引:
alter table `boblog_blogs` add index blogalias(blogalias);
alter table `boblog_blogs` drop index blogalias;
alter table boblog_blogs add FULLTEXT(content); //全文索引
扩大字段的长度:
修改表字段的默认值为空不为null:
修改表字段enum的新类型none:
# 修改表的注释
# 修改字段的注释 --注意:字段名和字段类型照写就行
添加一个自增长字段并且添在最前面用first,如下:
ALTER TABLE `object_video_upload` ADD `id` INT(32) NOT NULL AUTO_INCREMENT COMMENT 'auto_increase comment' first;
如果我在一个表上两个字段指定auto_increment呢?
mysql> create table tab_auto_incr(a int not null auto_increment,b int not null auto_increment,primary key (a),unique key (b));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key//是:Innodb:
InnoDb引擎中对auto_increment的误解:http://jiuchen.sinaapp.com/136.html
结论3:在InnoDB中,auto_increment至少需要单独为索引字段(主键也是索引的一种)。
结论4:在InnoDB中,auto_increment可以和其他字段组成联合索引,但auto_increment必须位于最左侧(和MyISAM不同)。
所以,如果表已经建立好了,想加一个id并为auto_increment的字段得,先建立这个字段(暂还能有auto_increment的属性,否则报错如上),再添加索引,再修改这个字段为auto_increment,操作如下,并实践Ok,发现这个新加的id确实变为自动由1,2,3...这样的值了:
MYISM:
不行!说明一个表只能有一个auto_increment,且该列必须是primary key或者unique key。
更多:http://blog.csdn.net/feihong247/article/details/7748788
# 查看字段注释的方法 --show
要想一个字段是AUTO_INCREMENT ,它必须是一个索引,刚才一时心急,搞忘记了,备份下。
其根本是:create table Tbl_File_XXX(select * from Tbl_File_Bak_XXX); 这个语句在表Tbl_File_XXX中是不会有索引的。
以后怎么解决这个问题:
create table aaa like Tbl_User
insert into table select xxx
加在最前面FIRST :
ALTER TABLE `jiu` ADD `11` VARCHAR( 1 ) NOT NULL FIRST ;
测试Ok,索引带过来了:
create table aaa like Tbl_File_Bak;
导入: insert into aaa select * from Tbl_File_Bak;
示例:
=====================================================================
drop table Tbl_File;
create table Tbl_File like Tbl_File_Bak;
insert into Tbl_File select * from Tbl_File_Bak;
source /home/admin/745.txt
=====================================================================
直接select into 不会复制任何索引和主键,一般先create table like ,然后再select into
mysql> create table cc like test;
Query OK, 0 rows affected (0.04 sec)
mysql> desc cc;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
mysql> insert into cc (select * from test);
mysql>Query OK, 5 rows affected (0.01 sec)
Over!
create table cs_bak1 as(select * from test) ; //备份表数据一模一样的,但索引没了,默认引擎和编码:服务器默认的存储引擎而不是源表的存储引擎
create table cs_bak like test; //相同的结构来创建一个新表,列名、数据类型、空指和索引也将复制,但是表的内容不会被复制。外键和专用的权限也没有被复制。
参考对比URL:http://phpdeveloper.cn/mysql-mysql%E5%A4%8D%E5%88%B6%E8%A1%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95
select into在Mysql中不适用,不支持:
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢。
answer 01:
create table dust select * from student;//用于复制前未创建新表dust的情况下
answer 02:
insert into dust select * from student;//已经创建了新表dust的情况下
现在请各位用select..into..语句实现以上东东,谢谢支持,再次感谢!
网友回复:该回复于2008-09-29 06:37:03被版主删除
网友回复:sqlserver可以那樣寫,但是mySql中貌似不行哦,另外樓主你說的那兩種寫法,應該是最常見的啊
网友回复:create table dust select * from student;
网友回复:楼上的写的是我发的里面的啊,我要的是 select into 语句的啊?
请各位大侠帮忙,谢谢!
网友回复:MySQL不支持Select Into语句直接备份表结构和数据,一些种方法可以代替, 也有其它方法可以处理,总结如下:
方法1:
MYSQL不支持:
Select * Into new_table_name from old_table_name;
替代方法:
Create table new_table_name (Select * from old_table_name);
来源:http://hi.baidu.com/%D3%D2%CA%D6%C4%AA%D4%FA%CC%D8%B5%C4/blog/item/ed236851533190818d5430b3.html
一、
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '合作伙伴ID',
PRIMARY KEY (`id`),
UNIQUE KEY `verifycode` (`verifycode`,`eid`)
二、
新加一个字段:
ALTER TABLE `object_partner` ADD `eid` VARCHAR( 16 ) NOT NULL AFTER `coop_type`
三、
把这新加的字段再加为联合索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD PRIMARY KEY ( `verifycode` , `eid` )
四、
添加一个id字段与表开头 FIRST:
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
五、
给这个id字段加上primary索引(因前面加过primary索引,不能现再加出现下面提示):
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
六、给前面第三步的primary联合索引去掉后加上 UNIQUE 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD UNIQUE (
`verifycode` ,
`eid`
)
七、去掉后,给id字段加上前面的primary 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` ADD INDEX ( `id` )
use 某个DB后:
status
可以看到DB的情况,尤其是乱码的问题等:
默认:
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
set names utf8 后:
Server characterset: latin
Db characterset: latin
Client characterset: utf8
Conn. characterset: utf8
导入依旧有问题,正确的应该默认就是DB:Utf8,导入才会可能正常:
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
mysql> ALTER TABLE `Tbl_User_NNN` ADD INDEX ( `FMemo_Extra` ( 16 ) ) ;
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
添加mysql数据库字段
使用ALTER TABLE [表名] ADD [字段]s语句……
索引
1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
实践成功如下:
3.主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。
//主键549830479
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);//增加一个新列549830479
alter table t2 add d timestamp;
alter table infos add ex tinyint not null default '0';//删除列549830479
alter table t2 drop column c;//重命名列549830479
alter table t1 change a b integer;
//改变列的类型549830479
alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';
//重命名表549830479
alter table t1 rename t2;加索引549830479
mysql> alter table tablename change depno depno int(5) not null;
mysql> alter table tablename add index 索引名 (字段名1[,字段名2 …]);
mysql> alter table tablename add index emp_name (name);加主关键字的索引549830479
mysql> alter table tablename add primary key(id);加唯一限制条件的索引549830479
mysql> alter table tablename add unique emp_name2(cardnumber);删除某个索引549830479
mysql>alter table tablename drop index emp_name;修改表:549830479
增加字段:549830479
mysql> ALTER TABLE table_name ADD field_name field_type;修改原字段名称及类型:549830479
mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;删除字段:549830479
mysql> ALTER TABLE table_name DROP field_name;
参考:http://flyer2010.iteye.com/blog/1064390
最常用同步关于库权限查询指令,基础预备:查一下数据库有用户及权限:
select distinct concat('user: ''',user,'''@''',host,''';') as query from mysql.user;
=================================================================
mysql> show create database jackxiang_mysql;
+-----------------+----------------------------------------------------------------------------+
| Database | Create Database |
+-----------------+----------------------------------------------------------------------------+
| jackxiang_mysql | CREATE DATABASE `jackxiang_mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+-----------------+----------------------------------------------------------------------------+
依葫芦画瓢:
建表基本结构都有:
如果是字符串的 NOT NULL DEFAULT '';
如果是数字型的 NOT NULL DEFAULT 0;
有兄弟说default '' 跨库也麻烦,不如default null:
用is null 和 ='' 都无法全部查询出来,有些人写程序,很容易把默认null的字段 插入成'',但是默认的很多数据又是null,这样一个字段会有 ''和null同时存在。
在上面表中加个索引:
Default值设定及Null设定
字符串:
alter table t_tst_root add busiLevel varchar(255) default '' not null after f_Id;
Int整形:
alter table t_tst_root add f_TstProjId int(10) default 0 not null after f_Id;
ALTER TABLE `Tbl_File` ADD PRIMARY KEY ( `FFileId` )
ALTER TABLE `Tbl_File` CHANGE `FFileId` `FFileId` INT( 11 ) NOT NULL AUTO_INCREMENT
________________________________________________________________________________________________
ALTER TABLE `temperatureone` CHANGE `nowTempValue` `nowTempValue` FLOAT(5,2) NOT NULL COMMENT '现在温度'
PHPMyadmin:
字段 nowTempValue
类型 FLOAT
长度/值*1 5,2
________________________________________________________________________________________________
alter table test add index id(id); //id不能有引号
加一个字段:
如果想要添加在某个字段的后面则是这样的:
想要修改一个字段及默认值:
把字段由text类似修改为var_char类型(我的bo-blog,里的字段作优化,bo-blog不更新了,自己作如下优化):
mysql里的长度简述:
CHAR(M) 0<M<=255(建议CHAR(1)外,超过此长度的用VARCHAR) M个字符(所占空间跟字符集等有关系)
VARCHAR(M) 0<M<65532/N M个字符(N大小由字符集,以及是否为中文还是字母数字等有关系)
TEXT 64K个字符 所占空间跟字符集等有关系
想删除某个字段:
添加索引、删除索引:
alter table `boblog_blogs` add index blogalias(blogalias);
alter table `boblog_blogs` drop index blogalias;
alter table boblog_blogs add FULLTEXT(content); //全文索引
扩大字段的长度:
修改表字段的默认值为空不为null:
修改表字段enum的新类型none:
# 修改表的注释
# 修改字段的注释 --注意:字段名和字段类型照写就行
添加一个自增长字段并且添在最前面用first,如下:
ALTER TABLE `object_video_upload` ADD `id` INT(32) NOT NULL AUTO_INCREMENT COMMENT 'auto_increase comment' first;
如果我在一个表上两个字段指定auto_increment呢?
mysql> create table tab_auto_incr(a int not null auto_increment,b int not null auto_increment,primary key (a),unique key (b));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key//是:Innodb:
InnoDb引擎中对auto_increment的误解:http://jiuchen.sinaapp.com/136.html
结论3:在InnoDB中,auto_increment至少需要单独为索引字段(主键也是索引的一种)。
结论4:在InnoDB中,auto_increment可以和其他字段组成联合索引,但auto_increment必须位于最左侧(和MyISAM不同)。
所以,如果表已经建立好了,想加一个id并为auto_increment的字段得,先建立这个字段(暂还能有auto_increment的属性,否则报错如上),再添加索引,再修改这个字段为auto_increment,操作如下,并实践Ok,发现这个新加的id确实变为自动由1,2,3...这样的值了:
MYISM:
不行!说明一个表只能有一个auto_increment,且该列必须是primary key或者unique key。
更多:http://blog.csdn.net/feihong247/article/details/7748788
# 查看字段注释的方法 --show
要想一个字段是AUTO_INCREMENT ,它必须是一个索引,刚才一时心急,搞忘记了,备份下。
其根本是:create table Tbl_File_XXX(select * from Tbl_File_Bak_XXX); 这个语句在表Tbl_File_XXX中是不会有索引的。
以后怎么解决这个问题:
create table aaa like Tbl_User
insert into table select xxx
加在最前面FIRST :
ALTER TABLE `jiu` ADD `11` VARCHAR( 1 ) NOT NULL FIRST ;
测试Ok,索引带过来了:
create table aaa like Tbl_File_Bak;
导入: insert into aaa select * from Tbl_File_Bak;
示例:
=====================================================================
drop table Tbl_File;
create table Tbl_File like Tbl_File_Bak;
insert into Tbl_File select * from Tbl_File_Bak;
source /home/admin/745.txt
=====================================================================
直接select into 不会复制任何索引和主键,一般先create table like ,然后再select into
mysql> create table cc like test;
Query OK, 0 rows affected (0.04 sec)
mysql> desc cc;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
mysql> insert into cc (select * from test);
mysql>Query OK, 5 rows affected (0.01 sec)
Over!
create table cs_bak1 as(select * from test) ; //备份表数据一模一样的,但索引没了,默认引擎和编码:服务器默认的存储引擎而不是源表的存储引擎
create table cs_bak like test; //相同的结构来创建一个新表,列名、数据类型、空指和索引也将复制,但是表的内容不会被复制。外键和专用的权限也没有被复制。
参考对比URL:http://phpdeveloper.cn/mysql-mysql%E5%A4%8D%E5%88%B6%E8%A1%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95
select into在Mysql中不适用,不支持:
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢。
answer 01:
create table dust select * from student;//用于复制前未创建新表dust的情况下
answer 02:
insert into dust select * from student;//已经创建了新表dust的情况下
现在请各位用select..into..语句实现以上东东,谢谢支持,再次感谢!
网友回复:该回复于2008-09-29 06:37:03被版主删除
网友回复:sqlserver可以那樣寫,但是mySql中貌似不行哦,另外樓主你說的那兩種寫法,應該是最常見的啊
网友回复:create table dust select * from student;
网友回复:楼上的写的是我发的里面的啊,我要的是 select into 语句的啊?
请各位大侠帮忙,谢谢!
网友回复:MySQL不支持Select Into语句直接备份表结构和数据,一些种方法可以代替, 也有其它方法可以处理,总结如下:
方法1:
MYSQL不支持:
Select * Into new_table_name from old_table_name;
替代方法:
Create table new_table_name (Select * from old_table_name);
来源:http://hi.baidu.com/%D3%D2%CA%D6%C4%AA%D4%FA%CC%D8%B5%C4/blog/item/ed236851533190818d5430b3.html
一、
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '合作伙伴ID',
PRIMARY KEY (`id`),
UNIQUE KEY `verifycode` (`verifycode`,`eid`)
二、
新加一个字段:
ALTER TABLE `object_partner` ADD `eid` VARCHAR( 16 ) NOT NULL AFTER `coop_type`
三、
把这新加的字段再加为联合索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD PRIMARY KEY ( `verifycode` , `eid` )
四、
添加一个id字段与表开头 FIRST:
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
五、
给这个id字段加上primary索引(因前面加过primary索引,不能现再加出现下面提示):
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
六、给前面第三步的primary联合索引去掉后加上 UNIQUE 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD UNIQUE (
`verifycode` ,
`eid`
)
七、去掉后,给id字段加上前面的primary 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` ADD INDEX ( `id` )
use 某个DB后:
status
可以看到DB的情况,尤其是乱码的问题等:
默认:
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
set names utf8 后:
Server characterset: latin
Db characterset: latin
Client characterset: utf8
Conn. characterset: utf8
导入依旧有问题,正确的应该默认就是DB:Utf8,导入才会可能正常:
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
mysql> ALTER TABLE `Tbl_User_NNN` ADD INDEX ( `FMemo_Extra` ( 16 ) ) ;
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
添加mysql数据库字段
使用ALTER TABLE [表名] ADD [字段]s语句……
索引
1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
实践成功如下:
3.主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。
//主键549830479
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);//增加一个新列549830479
alter table t2 add d timestamp;
alter table infos add ex tinyint not null default '0';//删除列549830479
alter table t2 drop column c;//重命名列549830479
alter table t1 change a b integer;
//改变列的类型549830479
alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';
//重命名表549830479
alter table t1 rename t2;加索引549830479
mysql> alter table tablename change depno depno int(5) not null;
mysql> alter table tablename add index 索引名 (字段名1[,字段名2 …]);
mysql> alter table tablename add index emp_name (name);加主关键字的索引549830479
mysql> alter table tablename add primary key(id);加唯一限制条件的索引549830479
mysql> alter table tablename add unique emp_name2(cardnumber);删除某个索引549830479
mysql>alter table tablename drop index emp_name;修改表:549830479
增加字段:549830479
mysql> ALTER TABLE table_name ADD field_name field_type;修改原字段名称及类型:549830479
mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;删除字段:549830479
mysql> ALTER TABLE table_name DROP field_name;
参考:http://flyer2010.iteye.com/blog/1064390
有时,我们爱上的可能只是“爱情”本身,而不是爱情的当事人。
翠花小姐在春节前夕做了一道很难的选择题:答应男友的求婚?还是勇敢地说“不”?翠花之所以痛苦在于,她发现男主角的玫瑰、钻戒以及誓言蜜语都不错,糟糕的是,自己怎么没有飞蛾扑火的激情,再仔细一推敲,上帝呵,这个男孩还真的不是自己最后要找的那个人,自己怎么还乐颠颠地跟他谈了一年多的恋爱?
不是自己被对方骗了,而是自己被爱情的美丽童话以及快乐情绪骗了,曾经被动地上了对方的爱情之船,嘻嘻哈哈,花花草草,也美妙美好,但她爱上的仅是“爱情”,而不是具体的这个男人。还好,爱情船不是贼船,她及时地跳出自己的思维陷阱,真诚地婉言谢绝……
所以,正在恋爱中的女孩不要被美伦美奂的爱情氛围所迷惑,在用感官享受快乐、甜蜜的同时,不妨抽点时间独立思考一下:他,值得我爱吗?爱他什么?他是一个怎样的人?当然还要看看老男人网为你提供的一些良心建议——
1、你是被他追得晕头转向后答应与他恋爱的吗?
很多男人“赖”功了得,女孩又心太软,经不起对方的耐心与用心,就客气地上路了,感觉也不错,但可能这只是表像,就好像手心冒汗不一定是因为热,而是另外一种情绪(如紧张)的反应,所以不要因自己内心“有点湿”就以为自己的爱情G点来了。
2、恋爱前,你很寂寞吗?
爱情可以如一朵花热闹地开着,但玫瑰带香,海棠就不香,你仔细用嗅觉“思考”过吗?你开的花,是玫瑰,还是海棠,请小心鉴别。也许寂寞没有了,但这个男孩真的为你带来了爱神吗?不一定的,寂寞的时候,精于计算金钱数字,或者打牌,却不一定适合判断爱情。
3、你是个喜欢做白日梦,爱幻想的女孩吗?
也许你读过许多爱情名著,看到许多言情影视,于是内心柔情一天天在堆积,有一天,有个男孩撞开你心房,因为柔情轰然四溢,你就误会了自己的感情,以为白马王子来了。这很危险,因为感情的闸门不是你自觉打开的,你只是这出爱情的宾语,请认真查对。骑白马的不一定都是白马王子,还有唐僧!
4、与他恋爱,是不是因为随大流,因为大家身边都有男主角,所以我也要一个?
如果是这样的话,请扪心自问,他可以满足你多少的虚荣心?是否还有恨铁不成钢的感觉?时尚潮流会左右很多女孩的心,从选择一条短裙开始,直到选择一个男友。
5、你很快乐,很好,可是你想过吗?这是因为爱情而快乐,还是因为他赋予你的快乐?
很多女孩一投入爱情中,往往忽视男主角本身的硬件或软件,只欣欣然于爱情带给她的跌宕起伏的情绪快感。在男友的臂弯里很暖,其实,在你妈妈的怀里也一样暖,但因为前者有爱情的光环在头顶,所以你会觉得他的“暖”带电。
6、他很霸道吗?是不是总以迅雷不及掩耳之势强吻你?
是不是喜欢做了再说?可怜的女孩很多时候喜欢这种被男方“强行”的感觉,觉得对方的爱情功力强悍,自己不得不为其折服,从而美化对方的种种“蛮横”之言行,殊不知,这是很不聪明的,更可怕的是用爱情万能论来解释那个男主角的种种缺点,也许有一天爱情谈化了,你会惊讶发现他所有的占有欲都带有暴力倾向,而曾经你都把它解读为爱情的“必要粗鲁”。
7、没有你,他就活不了,是这样吗?
这很感人,特别在爱情的迷雾下。但我要提醒你,男人喜欢在爱情磁场里让你迷失方向,以为你就是他的救世主就是他全部的世界。这种夸大其辞的语言,从某种意义上说,是比谎言还可怕,因为它让你丧失判断力和理性思维,但说实话,爱情又赋予男人说这种煽情不脸红的大话的权利,所以,这时的女主角,就要好好分析,自己是因为确实想为这个男人奉献一切,还是因为受到对方的心理暗示,而不得不像个死心踏地的爱情女主角?
恋爱要有一双慧眼,还要有颗冰雪聪明的心,否则你就可能成为恋爱中迷途的羔羊,而身边还有一只彷徨的狼。爱情是婚姻的热身,如果你有心走更远的路,不得不从“心”考察他的一切。E时代用手指头谈恋爱,还要用脑。
翠花小姐在春节前夕做了一道很难的选择题:答应男友的求婚?还是勇敢地说“不”?翠花之所以痛苦在于,她发现男主角的玫瑰、钻戒以及誓言蜜语都不错,糟糕的是,自己怎么没有飞蛾扑火的激情,再仔细一推敲,上帝呵,这个男孩还真的不是自己最后要找的那个人,自己怎么还乐颠颠地跟他谈了一年多的恋爱?
不是自己被对方骗了,而是自己被爱情的美丽童话以及快乐情绪骗了,曾经被动地上了对方的爱情之船,嘻嘻哈哈,花花草草,也美妙美好,但她爱上的仅是“爱情”,而不是具体的这个男人。还好,爱情船不是贼船,她及时地跳出自己的思维陷阱,真诚地婉言谢绝……
所以,正在恋爱中的女孩不要被美伦美奂的爱情氛围所迷惑,在用感官享受快乐、甜蜜的同时,不妨抽点时间独立思考一下:他,值得我爱吗?爱他什么?他是一个怎样的人?当然还要看看老男人网为你提供的一些良心建议——
1、你是被他追得晕头转向后答应与他恋爱的吗?
很多男人“赖”功了得,女孩又心太软,经不起对方的耐心与用心,就客气地上路了,感觉也不错,但可能这只是表像,就好像手心冒汗不一定是因为热,而是另外一种情绪(如紧张)的反应,所以不要因自己内心“有点湿”就以为自己的爱情G点来了。
2、恋爱前,你很寂寞吗?
爱情可以如一朵花热闹地开着,但玫瑰带香,海棠就不香,你仔细用嗅觉“思考”过吗?你开的花,是玫瑰,还是海棠,请小心鉴别。也许寂寞没有了,但这个男孩真的为你带来了爱神吗?不一定的,寂寞的时候,精于计算金钱数字,或者打牌,却不一定适合判断爱情。
3、你是个喜欢做白日梦,爱幻想的女孩吗?
也许你读过许多爱情名著,看到许多言情影视,于是内心柔情一天天在堆积,有一天,有个男孩撞开你心房,因为柔情轰然四溢,你就误会了自己的感情,以为白马王子来了。这很危险,因为感情的闸门不是你自觉打开的,你只是这出爱情的宾语,请认真查对。骑白马的不一定都是白马王子,还有唐僧!
4、与他恋爱,是不是因为随大流,因为大家身边都有男主角,所以我也要一个?
如果是这样的话,请扪心自问,他可以满足你多少的虚荣心?是否还有恨铁不成钢的感觉?时尚潮流会左右很多女孩的心,从选择一条短裙开始,直到选择一个男友。
5、你很快乐,很好,可是你想过吗?这是因为爱情而快乐,还是因为他赋予你的快乐?
很多女孩一投入爱情中,往往忽视男主角本身的硬件或软件,只欣欣然于爱情带给她的跌宕起伏的情绪快感。在男友的臂弯里很暖,其实,在你妈妈的怀里也一样暖,但因为前者有爱情的光环在头顶,所以你会觉得他的“暖”带电。
6、他很霸道吗?是不是总以迅雷不及掩耳之势强吻你?
是不是喜欢做了再说?可怜的女孩很多时候喜欢这种被男方“强行”的感觉,觉得对方的爱情功力强悍,自己不得不为其折服,从而美化对方的种种“蛮横”之言行,殊不知,这是很不聪明的,更可怕的是用爱情万能论来解释那个男主角的种种缺点,也许有一天爱情谈化了,你会惊讶发现他所有的占有欲都带有暴力倾向,而曾经你都把它解读为爱情的“必要粗鲁”。
7、没有你,他就活不了,是这样吗?
这很感人,特别在爱情的迷雾下。但我要提醒你,男人喜欢在爱情磁场里让你迷失方向,以为你就是他的救世主就是他全部的世界。这种夸大其辞的语言,从某种意义上说,是比谎言还可怕,因为它让你丧失判断力和理性思维,但说实话,爱情又赋予男人说这种煽情不脸红的大话的权利,所以,这时的女主角,就要好好分析,自己是因为确实想为这个男人奉献一切,还是因为受到对方的心理暗示,而不得不像个死心踏地的爱情女主角?
恋爱要有一双慧眼,还要有颗冰雪聪明的心,否则你就可能成为恋爱中迷途的羔羊,而身边还有一只彷徨的狼。爱情是婚姻的热身,如果你有心走更远的路,不得不从“心”考察他的一切。E时代用手指头谈恋爱,还要用脑。
1、
没钱的男人十有八九不自信。
有钱的男人十有八九充满了自信。
2、
没钱的男人想怎样挣钱。
有钱的男人想怎样花钱。
3、
对没钱的男人来说,钱真是他妈的罪恶,没钱就办不成很多事。
对有钱的男人来说,钱真是他妈的美好,有钱就办成了很多事。
4、
没钱的男人,小的时候,爱对父母说:爸,妈,你们要是有钱就好了。等到自己长大做了父亲后,又爱对孩子说:孩子,你要学会坚强,要学会靠自己,钱不是万能的。
有钱的男人,小的时候,爱对父母说:爸,妈,你们又不是没钱。等到自己长大做了父亲后,又爱对孩子说:孩子,你说,你要什么,老爸给你买。
5、
没钱的男人和几个朋友一同出去海吃海喝,即使表面上非常快乐,但心底里还是忍不住要犯嘀咕:结帐时,这钱到底谁付?
有钱的男人和几个朋友一同出去海吃海喝,快哉乐哉,没什么好犯嘀咕的,对他来说,钱不是问题,只要吃得好喝得好玩得好,就开心。
6、
有钱的男人对没钱的男人这样看:你不仅只是没有钱,而且,潇洒,慷慨,你也没有。
没钱的男人对有钱的男人这样看:你不就是有几个钱嘛,有钱,潇洒,慷慨,谁不会。
7、
没钱的男人没面子。这不需要什么理由。没钱就是理由。
有钱的男人有面子。这也不需要什么理由。有钱就是理由。
8、
没钱的男人在追求一个女孩时:她对我,虽然是这也爱,那也爱,可是,她要是又爱钱,那我该怎么办?
有钱的男人在追求一个女孩时:她对我,虽然是这也不爱,那也不爱,但是,她只要还爱钱,我就有办法。
9、
没钱的男人说:贫富差距,我虽然怕,但由此造成的社会尊重的差距,我更怕。
有钱的男人说:没有社会尊重的差距,我光要贫富差距做什么。我希望没钱的男人能理解这么一个道理:毕竟,有钱人永远只是少数。
10、
对没钱的男人来说,过舒服的日子,这是远虑,近忧是,怎样挣更多的钱。
对有钱的男人来说,过怎样舒服的日子,这是近忧,挣更多的钱,那是远虑。
11、
没钱的男人想:生活中要是这么多事都不与钱发生关系,那我就可以过得很好了。
有钱的男人想:幸亏生活中有这么多事都与钱发生关系,不然,我不会过得这么好。
12、
有时,没钱的男人急了:最好社会发生动荡,让那些有钱的男人也尝尝没钱的滋味。
有时,有钱的男人急了:凭什么人家有钱你就眼红。有本事你也挣去。
13、
没钱的男人:那个五星级的酒店,我要是能睡一晚就好了。
有钱的男人:什么五星级的酒店,还不如我家里的一个客厅。
14、
没钱的男人和老婆吵架了,老婆说,当初,要不是我,你这么穷,谁肯嫁给你。
有钱的男人和老婆吵架了,老婆说,你不要以为你有钱,就可以这样对我。
15、
没钱的男人:我发现了一个规律,现在,打工的,几乎都是没钱的男人。在这个规律面前,我是一个弱者,我很无奈。
有钱的男人:我也发现了一个规律,现在,打工的,几乎都是没钱的男人。在这个规律面前,我是一个强者,我利用了它。
16、
没钱的男人:我要是成为有钱的男人就好了。
有钱的男人:我永远都不要成为没钱的男人。
没钱的男人十有八九不自信。
有钱的男人十有八九充满了自信。
2、
没钱的男人想怎样挣钱。
有钱的男人想怎样花钱。
3、
对没钱的男人来说,钱真是他妈的罪恶,没钱就办不成很多事。
对有钱的男人来说,钱真是他妈的美好,有钱就办成了很多事。
4、
没钱的男人,小的时候,爱对父母说:爸,妈,你们要是有钱就好了。等到自己长大做了父亲后,又爱对孩子说:孩子,你要学会坚强,要学会靠自己,钱不是万能的。
有钱的男人,小的时候,爱对父母说:爸,妈,你们又不是没钱。等到自己长大做了父亲后,又爱对孩子说:孩子,你说,你要什么,老爸给你买。
5、
没钱的男人和几个朋友一同出去海吃海喝,即使表面上非常快乐,但心底里还是忍不住要犯嘀咕:结帐时,这钱到底谁付?
有钱的男人和几个朋友一同出去海吃海喝,快哉乐哉,没什么好犯嘀咕的,对他来说,钱不是问题,只要吃得好喝得好玩得好,就开心。
6、
有钱的男人对没钱的男人这样看:你不仅只是没有钱,而且,潇洒,慷慨,你也没有。
没钱的男人对有钱的男人这样看:你不就是有几个钱嘛,有钱,潇洒,慷慨,谁不会。
7、
没钱的男人没面子。这不需要什么理由。没钱就是理由。
有钱的男人有面子。这也不需要什么理由。有钱就是理由。
8、
没钱的男人在追求一个女孩时:她对我,虽然是这也爱,那也爱,可是,她要是又爱钱,那我该怎么办?
有钱的男人在追求一个女孩时:她对我,虽然是这也不爱,那也不爱,但是,她只要还爱钱,我就有办法。
9、
没钱的男人说:贫富差距,我虽然怕,但由此造成的社会尊重的差距,我更怕。
有钱的男人说:没有社会尊重的差距,我光要贫富差距做什么。我希望没钱的男人能理解这么一个道理:毕竟,有钱人永远只是少数。
10、
对没钱的男人来说,过舒服的日子,这是远虑,近忧是,怎样挣更多的钱。
对有钱的男人来说,过怎样舒服的日子,这是近忧,挣更多的钱,那是远虑。
11、
没钱的男人想:生活中要是这么多事都不与钱发生关系,那我就可以过得很好了。
有钱的男人想:幸亏生活中有这么多事都与钱发生关系,不然,我不会过得这么好。
12、
有时,没钱的男人急了:最好社会发生动荡,让那些有钱的男人也尝尝没钱的滋味。
有时,有钱的男人急了:凭什么人家有钱你就眼红。有本事你也挣去。
13、
没钱的男人:那个五星级的酒店,我要是能睡一晚就好了。
有钱的男人:什么五星级的酒店,还不如我家里的一个客厅。
14、
没钱的男人和老婆吵架了,老婆说,当初,要不是我,你这么穷,谁肯嫁给你。
有钱的男人和老婆吵架了,老婆说,你不要以为你有钱,就可以这样对我。
15、
没钱的男人:我发现了一个规律,现在,打工的,几乎都是没钱的男人。在这个规律面前,我是一个弱者,我很无奈。
有钱的男人:我也发现了一个规律,现在,打工的,几乎都是没钱的男人。在这个规律面前,我是一个强者,我利用了它。
16、
没钱的男人:我要是成为有钱的男人就好了。
有钱的男人:我永远都不要成为没钱的男人。
1、夫妻感情实笃。
其实这个理由有些牵强,千万不要相信外遇男人的鳄鱼眼泪。他们会把自己的婚姻生活说得一团糟,由此获取同情与谅解。其实很多男人明明婚姻美满,家庭幸福,却偏偏要平地起波澜。所以女人千万不要患幼稚病,觉得外遇只会遇上别人的老公,而自己的老公是绝缘体。
2、自身条件不够。
外遇是一项奢侈消费,不是每个已婚男人都有足够的资本和魅力让其他女子甘心情愿做第三者的。平庸男人即便垂涎欲滴也只能“高山仰止,心向往之”。他们不是不愿,只是不能,但凡有天鸡犬升天了,定然“贵易交,富易妻”。所谓“老实男人”多属于此。
3、有贼心,没贼胆。
外遇是瑞士银行里的一颗“祖母绿”,像《偷天陷阱》中的泽塔琼斯般,非有胆有识者莫敢偷天换柱。欲外遇者,想到其严重后果——家破人亡、妻离子散、前程尽失、臭名昭著......机会成本太大,就不得不望而却步,敬而远之。理智男人多属于此。
4、嫌麻烦。
外遇是一个复杂而系统的工程,经济、政治、文化无所不包,谎言、欺骗无所不用有外遇就像搞外交,玩平衡要玩得天衣无缝,要两面讨好,还要八面玲珑,每天生活像打仗,实在分身乏术、时间有限,心脏脆弱者难受其力,麻烦透顶,还是得过且过吧。懒惰男人多属于此。
5、机遇不逮。
外遇就像中彩票,可遇而不可求。即便你有时间、精力、金钱和魅力,也要条件成熟,抓准时机。可能你是妻管严,没有自由,可能你没有遇上心仪而合适的对象,如果外遇女神不垂青你,也不要暗自悲伤。所谓”冯唐易老,李广难封。”古人多有怀才不遇者,多你一个也不多了。
6、情感粗糙。
外遇是上等人的生活情节,也是慢工出细活的事。只有出身高贵、心思细腻者才会有此精神诉求。否则,一日三餐都不保,哪还有心思去外遇?情感粗糙的男人哄一个女人都嫌累,哪还有闲工夫去招架其他的女人?还不如跟哥们喝喝酒,打打牌来得痛快!
7、天花情结。
外遇就像出天花,但凡没出过,总有出天花的危险。而一旦出过,就有了抗体,不再患此疾。外遇是一部看上去很美的电影,实则逻辑混乱,内容分裂,神经歇斯底里。所以有过外遇的人明白此中真谛。不过此抗体的生存时间长短因人而异,有的人“好了伤疤忘了疼”,也有的人“一朝被蛇咬,十年怕井绳。”自:Club
十七岁的时候,有个女孩喜欢上了他,但是他离她很远,他心里面只有自己那个女孩,他觉得看别的女孩都是对她的不忠。
十八岁的时候,看了一个MTV,感动得想哭,他想,如果自己的女孩失去了双眼,他一定像男主角会毫不犹豫的把自己的眼睛给她,让她能看到光明。
十九岁的时候,高考了。终于和自己暗恋的女孩分别,坐火车去学校的时候,感觉自己离她越来越远,心像被掏空了一样。还在想自己一定不会忘记她,等到自己成功以后一定要去找她。
二十岁的时候,听到有人讲黄色笑话,觉得这人真可耻。
二十一岁的时候,她的回信中告诉他,自己有了男朋友。偷偷的哭了一个晚上。
二十二岁的时候,他向一个女孩表白,女孩说"你是个好人,可是我还小。"他想,我的确是个好人,他说"没关系,我可以等你。"心想,我不会像那些花心的人一样,三年五年我也能等。
二十三岁的时候,说自己还小的女孩和一个帅哥恋爱了。他很纳闷,长大原来可以这快。
二十四岁的时候,他又向一个女孩表白,女孩说"你是个好人,可是我并不适合你。"他纳闷很久,我是好人你怎么还不适合我呢?
二十五岁的时候,他又追求一个女孩,女孩接受了他。他开始很幸福的为未来拼搏,他想,一时的开心只是暂时的,只有努力拼搏,他和她才能有快乐的未来,但是,半年以后,女孩和他分手了。只是因为另外一个男孩会说让她开心的话。女孩说"你是个好人,是我对不起你。"他似乎明白了问题所在,他是个好人。
二十六岁的时候,他开始堕落,交网友。打扮得时尚而酷,而且渐渐的学习着讨好女孩的话。不久,他有了个女朋友,虽然他对她也很好,可是,他心里知道,自己并不爱她。
二十七岁的时候,他和女孩分手了。他对女孩说"你是个好女孩,是我对不起你。"
二十八岁的时候,他尝试了一夜情,发现别人能做的,自己也一样。
二十九岁的时候,他学会了讲黄色笑话,并且以看旁边的女孩子脸红为乐趣。
三十岁的时候,他忽然发现自己变得很有能力追求到女孩,但是却没有了爱的能力。于是
他在自己QQ上写下了如下的话************************************************
其实每个男孩,本来都是想做一个感情专一的好男人的。
其实每个男孩,本来看女孩子都是看脸而不是胸部的。其实每个男孩,本来都是不会讲黄色笑话的。
其实每个男孩,本来都是渴望爱一个人直到永远的。
只是,没有任何女孩爱这样的男孩,她们觉得这样的男孩太幼稚,太古板,没有情趣。
于是男孩开始改变,变成女孩喜欢的那种嘴角挂着坏坏的笑,玩世不恭或者幽默
开始学会说甜言蜜语而不是心里想说的话开始学会假装关心,学会给女孩送小饰物讨好她学会如何追求,如何把握爱情。或者看破红尘,游戏情场,成为女人恨恨的那种男人
他们可以很容易俘获女孩子的心但是他们也会在黑的夜里叼着烟流泪心里有爱的时候,没有女孩.有了女孩,却永远没有了爱的感觉在听到女人抱怨世上没有一个好男人时候他们不会再去努力做个好男人,只是微笑着擦肩而过
十八岁的时候,看了一个MTV,感动得想哭,他想,如果自己的女孩失去了双眼,他一定像男主角会毫不犹豫的把自己的眼睛给她,让她能看到光明。
十九岁的时候,高考了。终于和自己暗恋的女孩分别,坐火车去学校的时候,感觉自己离她越来越远,心像被掏空了一样。还在想自己一定不会忘记她,等到自己成功以后一定要去找她。
二十岁的时候,听到有人讲黄色笑话,觉得这人真可耻。
二十一岁的时候,她的回信中告诉他,自己有了男朋友。偷偷的哭了一个晚上。
二十二岁的时候,他向一个女孩表白,女孩说"你是个好人,可是我还小。"他想,我的确是个好人,他说"没关系,我可以等你。"心想,我不会像那些花心的人一样,三年五年我也能等。
二十三岁的时候,说自己还小的女孩和一个帅哥恋爱了。他很纳闷,长大原来可以这快。
二十四岁的时候,他又向一个女孩表白,女孩说"你是个好人,可是我并不适合你。"他纳闷很久,我是好人你怎么还不适合我呢?
二十五岁的时候,他又追求一个女孩,女孩接受了他。他开始很幸福的为未来拼搏,他想,一时的开心只是暂时的,只有努力拼搏,他和她才能有快乐的未来,但是,半年以后,女孩和他分手了。只是因为另外一个男孩会说让她开心的话。女孩说"你是个好人,是我对不起你。"他似乎明白了问题所在,他是个好人。
二十六岁的时候,他开始堕落,交网友。打扮得时尚而酷,而且渐渐的学习着讨好女孩的话。不久,他有了个女朋友,虽然他对她也很好,可是,他心里知道,自己并不爱她。
二十七岁的时候,他和女孩分手了。他对女孩说"你是个好女孩,是我对不起你。"
二十八岁的时候,他尝试了一夜情,发现别人能做的,自己也一样。
二十九岁的时候,他学会了讲黄色笑话,并且以看旁边的女孩子脸红为乐趣。
三十岁的时候,他忽然发现自己变得很有能力追求到女孩,但是却没有了爱的能力。于是
他在自己QQ上写下了如下的话************************************************
其实每个男孩,本来都是想做一个感情专一的好男人的。
其实每个男孩,本来看女孩子都是看脸而不是胸部的。其实每个男孩,本来都是不会讲黄色笑话的。
其实每个男孩,本来都是渴望爱一个人直到永远的。
只是,没有任何女孩爱这样的男孩,她们觉得这样的男孩太幼稚,太古板,没有情趣。
于是男孩开始改变,变成女孩喜欢的那种嘴角挂着坏坏的笑,玩世不恭或者幽默
开始学会说甜言蜜语而不是心里想说的话开始学会假装关心,学会给女孩送小饰物讨好她学会如何追求,如何把握爱情。或者看破红尘,游戏情场,成为女人恨恨的那种男人
他们可以很容易俘获女孩子的心但是他们也会在黑的夜里叼着烟流泪心里有爱的时候,没有女孩.有了女孩,却永远没有了爱的感觉在听到女人抱怨世上没有一个好男人时候他们不会再去努力做个好男人,只是微笑着擦肩而过
一位充满智慧的男人曾经告诉我:“作为一个男人,为了活你就必须先得死一次。”我既没有把他的话太放在心上,也没有完全明白他话中的意思,……直到我有了一次亲身经历。
也许有人会说:“你明白了,我还没明白呢!”那么,我就来解释一下:为什么有些被认为不怎么样的男人身边总断不了女友相伴?为什么你这个好男人却偏偏形单影只?
我是说,男人为了有佳人相伴,就必须首先让那个“好”我死去——一阵心痛的感觉之后,彻底释放内心的“坏”我。
一个经历过真正的爱情,为意中人奉献了一切,之后发现自己的心恰恰被那个人撕碎的男人一定能够理解我的意思。而那些还没有被他以心相许的那个人伤害过的男人很可能并不相信我的理论。无论如何,了解好男人终将失败并且屡试不爽的原因是非常重要的。
与很多女人认为的不同,男人是很希望建立一个成功的感情关系的。大多数男人都不会放弃任何追求自己梦中情人的机会。事实上,当一个男人真的遇到令自己心仪的女人,他的激情就会唤起心中的“好我”。他脑海中浮现的都是“我要把这个女人留住,因此我要做个好男人,我要好好待她,我要为她做一切事”这类的想法。
唯一的问题是,做好男人同时意味着做无聊的男人。征服别人和争取无法得到的东西都是能够带来极大兴奋感的欲望,做好男人会使与你交往的女人失去享受这种兴奋感的机会。最终,女人会因此失去对你的兴趣。
其结果就是,这个女人再去找一个能够为她的生活重新带来兴奋感的男人——通过接受一个新的挑战。挑战和兴奋感通常来自自私的态度,比如一个只在乎自己从不在乎别人的“坏”家伙的态度。好男人只能带着一颗破碎的心看着心爱的人远去,扪心自问究竟做错了什么。
直到这时,他才渐渐意识到,女人大都不清楚自己想要什么样的男人。反正做好男人在这个阶段肯定是没有益处的。办法只有一个:让“好我”死亡。这就是生活,是好男人们的大势所趋。
女人不断伤害着好男人,却把不怎么样的男人给她们带来的痛苦视为有益身心健康的良药。男人最终(并且往往很快)将会发现女人的这种“心愿”。于是,他们与内心中的某些东西一刀两断,开始学习做一个“不怎么样的男人”。
变成这种类型的男人,一般应该表现出偏激的态度,并且装得像个完全自私的男人,从不考虑别人的感受。另外,你还应该学会巧舌如簧的本领。这样的人能够为女人的生活带来天翻地覆般的激情和兴奋。直到木已成舟,女人又会为这个人伤心抑郁。因为此时,这个男人已经确确实实再不愿意完全地投入感情,以免引火烧身。可见,当女人在经意或不经意间将好男人改造为不怎么样的男人时,她们其实在搬起石头砸自己的脚。
如果说女人其实是想要好男人的,为什么多数好男人至今单身?又为什么我们总能听到某个女人与大无赖约会的故事?
原因是女人一般不想要好男人,或者说,她们没有意识到自己需要好男人。女人只重视情绪上的反应而不看事实真相。谁能为女人带来情绪上的跌宕起伏?当然是无赖们。
归根结底,我们究竟应该怎么做呢?没有人想被感情伤害,但也没有人想真的被当作无赖。重要的是,在感情面前保持态度的平衡。男人应该有本事追求女人,取悦女人并且保持自身的挑战性以便让女人兴奋。也就是说,应该好好对待女人,但要摆正她在你生活中的位置。不要从一开始就把她供在至高无上的位置,浑然忘记这世上还有你自己、你的至亲骨肉和你的朋友们。
也许有人会说:“你明白了,我还没明白呢!”那么,我就来解释一下:为什么有些被认为不怎么样的男人身边总断不了女友相伴?为什么你这个好男人却偏偏形单影只?
我是说,男人为了有佳人相伴,就必须首先让那个“好”我死去——一阵心痛的感觉之后,彻底释放内心的“坏”我。
一个经历过真正的爱情,为意中人奉献了一切,之后发现自己的心恰恰被那个人撕碎的男人一定能够理解我的意思。而那些还没有被他以心相许的那个人伤害过的男人很可能并不相信我的理论。无论如何,了解好男人终将失败并且屡试不爽的原因是非常重要的。
与很多女人认为的不同,男人是很希望建立一个成功的感情关系的。大多数男人都不会放弃任何追求自己梦中情人的机会。事实上,当一个男人真的遇到令自己心仪的女人,他的激情就会唤起心中的“好我”。他脑海中浮现的都是“我要把这个女人留住,因此我要做个好男人,我要好好待她,我要为她做一切事”这类的想法。
唯一的问题是,做好男人同时意味着做无聊的男人。征服别人和争取无法得到的东西都是能够带来极大兴奋感的欲望,做好男人会使与你交往的女人失去享受这种兴奋感的机会。最终,女人会因此失去对你的兴趣。
其结果就是,这个女人再去找一个能够为她的生活重新带来兴奋感的男人——通过接受一个新的挑战。挑战和兴奋感通常来自自私的态度,比如一个只在乎自己从不在乎别人的“坏”家伙的态度。好男人只能带着一颗破碎的心看着心爱的人远去,扪心自问究竟做错了什么。
直到这时,他才渐渐意识到,女人大都不清楚自己想要什么样的男人。反正做好男人在这个阶段肯定是没有益处的。办法只有一个:让“好我”死亡。这就是生活,是好男人们的大势所趋。
女人不断伤害着好男人,却把不怎么样的男人给她们带来的痛苦视为有益身心健康的良药。男人最终(并且往往很快)将会发现女人的这种“心愿”。于是,他们与内心中的某些东西一刀两断,开始学习做一个“不怎么样的男人”。
变成这种类型的男人,一般应该表现出偏激的态度,并且装得像个完全自私的男人,从不考虑别人的感受。另外,你还应该学会巧舌如簧的本领。这样的人能够为女人的生活带来天翻地覆般的激情和兴奋。直到木已成舟,女人又会为这个人伤心抑郁。因为此时,这个男人已经确确实实再不愿意完全地投入感情,以免引火烧身。可见,当女人在经意或不经意间将好男人改造为不怎么样的男人时,她们其实在搬起石头砸自己的脚。
如果说女人其实是想要好男人的,为什么多数好男人至今单身?又为什么我们总能听到某个女人与大无赖约会的故事?
原因是女人一般不想要好男人,或者说,她们没有意识到自己需要好男人。女人只重视情绪上的反应而不看事实真相。谁能为女人带来情绪上的跌宕起伏?当然是无赖们。
归根结底,我们究竟应该怎么做呢?没有人想被感情伤害,但也没有人想真的被当作无赖。重要的是,在感情面前保持态度的平衡。男人应该有本事追求女人,取悦女人并且保持自身的挑战性以便让女人兴奋。也就是说,应该好好对待女人,但要摆正她在你生活中的位置。不要从一开始就把她供在至高无上的位置,浑然忘记这世上还有你自己、你的至亲骨肉和你的朋友们。
总记录数 1210
免费短信记录数 300
80元短信费用。。。
按主被叫分类
主叫通话 32次 费用合计 13.67元
被叫通话 48次 费用合计 42.78元
按通话地点分类
本地通话 80次 费用合计 56.45元
漫游通话 0次 费用合计 0.00元
140多元的钱。。。+20元月租=170来块钱
个人认为这个月可能会少一些,因为开通了接听免费。。。可能短息还是占了一个很高的费用。
免费短信记录数 300
80元短信费用。。。
按主被叫分类
主叫通话 32次 费用合计 13.67元
被叫通话 48次 费用合计 42.78元
按通话地点分类
本地通话 80次 费用合计 56.45元
漫游通话 0次 费用合计 0.00元
140多元的钱。。。+20元月租=170来块钱
个人认为这个月可能会少一些,因为开通了接听免费。。。可能短息还是占了一个很高的费用。
企业邮箱G级别的快呀上线了。今晚12点线上测试,不得不加班,希望可以换个倒休,我想换到过年。。
An old web technology is slowly being resurrected from the depths of history. Browser features that have gone untouched for years are once again being employed to bring better responsiveness to UIs. Servers are learning to cope with a new way of doing things. And I’m not talking about Ajax.
New services like Jot Live and Meebo are built with a style of data transmission that is neither traditional nor Ajax. Their brand of low-latency data transfer to the browser is unique, and it is becoming ever-more common. Lacking a better term, I’ve taken to calling this style of event-driven, server-push data streaming “Comet”. It doesn’t stand for anything, and I’m not sure that it should. There is much confusion about how these techniques work, and so using pre-existing definitions and names is as likely to get as much wrong as it would get right.
Defining Comet
For a new term to be useful, at a minimum we need some examples of the technology, a list of the problems being solved, and properties which distinguish it from other techniques. As with Ajax, these aren’t hard to find. A short list of example applications includes:
So what makes these apps special? What makes them different from other things that might at first glance appear similar? Fundamentally, they all use long-lived HTTP connections to reduce the latency with which messages are passed to the server. In essence, they do not poll the server occasionally. Instead the server has an open line of communication with which it can push data to the client.
From the perspective of network activity, we can modify JJG’s original Ajax diagram to illustrate how Comet differs:
As is illustrated above, Comet applications can deliver data to the client at any time, not only in response to user input. The data is delivered over a single, previously-opened connection. This approach reduces the latency for data delivery significantly.
The architecture relies on a view of data which is event driven on both sides of the HTTP connection. Engineers familiar with SOA or message oriented middleware will find this diagram to be amazingly familiar. The only substantive change is that the endpoint is the browser.
While Comet is similar to Ajax in that it’s asynchronous, applications that implement the Comet style can communicate state changes with almost negligible latency. This makes it suitable for many types of monitoring and multi-user collaboration applications which would otherwise be difficult or impossible to handle in a browser without plugins.
Why Is Comet Better For Users?
Regular Ajax improves the responsiveness of a UI for a single user, but at the cost of allowing the context to go “stale” for long-lived pages. Changes to data from others users is lost until a user refreshes the whole page. An application can alternately return to the “bad old days” and maintain some sort of state mechanism by which it tells client about changes since the last time they’ve communicated. The user has to either wait until they preform some action which would kick off a request to see the updated state from other users (which might impact the action they wanted to preform!) or request changes from the server at some interval (called “polling”). Since the web is inherently multi-user, it’s pretty obvious that regular Ajax imposes usability and transparency hurdles for users. Applications that employ the Comet technique can avoid this problem by pushing updates to all clients as they happen. UI state does not go out of sync and everyone using an application can easily understand what their changes will mean for other users. Ajax improves single-user responsiveness. Comet improves application responsiveness for collaborative, multi-user applications and does it without the performance headaches associated with intermittent polling.
But Does It Scale?
New server software is often required to make applications built using Comet scale, but the patterns for event-driven IO on the server side are becoming better distributed. Even Apache will provide a Comet-ready worker module in the upcoming 2.2 release. Until then, tools like Twisted, POE, Nevow, mod_pubsub, and other higher-level event-driven IO abstractions are making Comet available to developers on the bleeding edge. Modern OSes almost all now support some sort of kernel-level event-driven IO system as well. I’ve even heard that Java’s NIO packages will start to take advantage of them in a forthcoming release. These tools are quietly making the event-driven future a reality. This stuff will scale, and most of the tools are in place already.
I’ll be giving a more on this topic at ETech and describing the various techniques that Comet applications can employ to push data from the server to the client. As always, I’ll post the slides here as well.
The future of the read-write web is multi-user. There is life after Ajax.
Endnotes
First, a word on terminology and its importance. “Ajax” was coined to describe background request/response data transfer. Many of us had worked on solutions to do exactly this, but it wasn’t until a simple name and accompanying description were provided that it was possible for people not directly building applications to describe what it was they liked about it. Common terminology acts not only as a shortcut in discussions between technical folks, but also as a bridge for those who may not be able to give a technical rundown of exactly how it works.
As with Ajax, those of us who build technology are now faced with another communication challenge. We have a hard problem for which solutions are available (and have been for some time) but no way to communicate about them. Terminology is again the missing link. Today, keeping an HTTP connection open for doing low-latency data transfer to the browser has no digestible name. When I describe a cool new hack, there’s nothing to associate it with. When people say “how the hell did they do that?”, we don’t have a compact answer. Therefore, in the spirit of improved communication (and not technology invention), I’m proposing a new name for this stuff.
Next, for those who are network-level programmers or are familiar with sockets and/or basic TCP/IP programming, you will probably scoff at the concept of web applications finally getting this kind of datagram packet support. Fair enough. It is however interesting to note that while more responsive UIs have been available on a variety of platforms to date, the Web has “won” the broad majority of market share for most classes of applications in which the browser provides enough native (non-plugin) support to make the performance and/or UI feasible. Comet may be a new name for an old set of concepts wrapped in some pretty grotty hacks, but that in no way diminishes the market impact it will have (and is already having).
Lastly, as current Dojo users might expect, Dojo already supports Comet via
dojo.io.bind()
. More than a year ago we designed the API with Comet in mind. In the next couple of weeks I’ll be showing how bind
’s pluggable transport layer can be combined with Dojo’s event topic mechanism to provide message delivery on top of a message bus.
我们先来看一段代码。
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
按照php手册里的说法
该函数将当前为止程序的所有输出发送到用户的浏览器。
上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。
好,我们来改一下这段代码,改成
<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。
我再来改一改。
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();//修改部分
flush();
sleep(1);
}
?>
运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。
打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes.
在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。
而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。
第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的 output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(” output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。
可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
sleep(1);
}
?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。
那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了)
<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
sleep(1);
}
?>
<?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
echo $i;
sleep(1);
}
?>
请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
以上所诉可能在某些浏览器中不成立。因为浏览器也有自己的规则。我是用Firefox1.5,IE6,opera8.5来测试的。其中opera就不能正常输出,因为它有一个规则,就是不遇到一个HTML标签,就绝对不输出,除非到脚本结束。而FireFox和IE还算比较正常的。
最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。
以下代码只在firefox下可用,其他浏览器并不支持multipart/x-mixed-replace的Content-Type.
<?php
header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
print "\n--endofsection\n";
$pmt = array("-", "\\", "|", "/" );
for( $i = 0; $i <10; $i ++ ){
sleep(1);
print "Content-type: text/plain\n\n";
print "Part $i\t".$pmt[$i % 4];
print "--endofsection\n";
ob_flush();
flush();
}
print "Content-type: text/plain\n\n";
print "The end\n";
print "--endofsection--\n";
?>
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
按照php手册里的说法
该函数将当前为止程序的所有输出发送到用户的浏览器。
上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。
好,我们来改一下这段代码,改成
<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。
我再来改一改。
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();//修改部分
flush();
sleep(1);
}
?>
运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。
打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes.
在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。
而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。
第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的 output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(” output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。
可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
sleep(1);
}
?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。
那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了)
<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
sleep(1);
}
?>
<?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
echo $i;
sleep(1);
}
?>
请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
以上所诉可能在某些浏览器中不成立。因为浏览器也有自己的规则。我是用Firefox1.5,IE6,opera8.5来测试的。其中opera就不能正常输出,因为它有一个规则,就是不遇到一个HTML标签,就绝对不输出,除非到脚本结束。而FireFox和IE还算比较正常的。
最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。
以下代码只在firefox下可用,其他浏览器并不支持multipart/x-mixed-replace的Content-Type.
<?php
header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
print "\n--endofsection\n";
$pmt = array("-", "\\", "|", "/" );
for( $i = 0; $i <10; $i ++ ){
sleep(1);
print "Content-type: text/plain\n\n";
print "Part $i\t".$pmt[$i % 4];
print "--endofsection\n";
ob_flush();
flush();
}
print "Content-type: text/plain\n\n";
print "The end\n";
print "--endofsection--\n";
?>
Windows Media Player文件
Windows Media Player文件
----==《在路上》==----
演唱:刘欢
那一天
我不得已上路
为不安分的心
为自尊的生存
为自我的证明
路上的辛酸已融进我的眼睛
心灵的困境已化作我的坚定
在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人
温暖我的人
◇◇◇◇◇◇
◆◆◆◆
◇◇◇◇◇◇
那一天
我不得已上路
为不安分的心
为自尊的生存
为自我的证明
路上的辛酸已融进我的眼睛
心灵的困境已化作我的坚定
在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人
温暖我的人
在路上 用我心灵的呼声
在路上 只为伴着我的人
在路上 是我生命的远行
在路上 只为温暖我的人
温暖我的人
欠你的温柔
如果我不能让你跟朋友比 我抱歉
如果我让你有一些不如意 我抱歉
你越说爱我不觉得吃力
我越担心有天你会离去
一字一句 吞了下去
表情和心情总是背道而行
欠你的温柔 是心中最大的石头
我不能够 给的足够
男人在爱里该谦卑还是该骄傲
欠你的温柔 是手里最慌的承诺
该怎么做 才配的上你善良的笑容
我要你告诉我
如果我不能让你跟朋友比 我抱歉
如果我让你有一些不如意 我抱歉
你越说爱我不觉得吃力
我越担心有天你会离去
一字一句 吞了下去
表情和心情总是背道而行
欠你的温柔 是心中最大的石头
我不能够 给的足够
男人在爱里该谦卑还是该骄傲
欠你的温柔 是手里最慌的承诺
该怎么做 才配的上你善良的笑容
我要你告诉我
欠你的温柔 是心中最大的石头
我不能够 给的足够
男人在爱里该谦卑还是该骄傲
欠你的温柔 是手里最慌的承诺
该怎么做 才配的上你善良的笑容
我要你告诉我