Apr
25
一,未然形
1 变化规则
① 五段动词:动词词尾变成其所在行的あ段字。
読む(よむ) 「词尾所在行:ま行、あ段字:ま」==よま
書く(かく) 「词尾所在行:か行、あ段字:か」==かか
死ぬ(しぬ)「词尾所在行:な行、あ段字:な」==しな
呼ぶ(呼ぶ)「词尾所在行:ば行、あ段字:ば」==よば
上がる(あがる)「词尾所在行:ら行、あ段字:ら」==あがら
切る(きる)「词尾所在行:ら行、あ段字:ら」==きら
② 一段动词:去掉动词词尾中的る。
食べる(たべる)「去掉动词词尾中的る」==たべ
起きる(おきる)「去掉动词词尾中的る」==おき
着る(きる)「去掉动词词尾中的る」==き
寝る(ねる)「去掉动词词尾中的る」==ね
③サ变动词:根据不同的需要,する分别变成し、さ、せ。
する==し、さ、せ。
勉強する==勉強し、勉強さ、勉強せ。
④カ变动词:くる变成こ。
来る(くる)==こ
2 各种实用例
A 否定:未然形+ない
① 私は本を読まない。(我不读书。)
② 田中さんは晩御飯を食べなかった。(田中没有吃晚饭。)
③ 毎日遊んで勉強しない。(每天玩,不学习。)
④今日は日曜日だから、山田さんは来ない。(今天是星期日,所以山田不来。)
B 被动、可能:未然形+れる、られる
① 弟は兄に殴られた。(弟弟被哥哥打了。)
② 眠くて、朝早く起きられない。(太困了,早晨不能起早。)
③ 授業中話をして先生に注意された。(上课说话,被老师批评了。)
④ 道路が渋滞で早く来られない。(道路拥挤,不能早来。)
C 敬语:未然形+れる、られる
① 小林先生はいつもお宅で新聞を読まれます。(小林先生总是在家读报纸。)
② 佐藤先生は学校まで遠いので、朝早く起きられます。(佐藤先生家离学校很远,所以每天早晨很早起床。)
③ 社長は会議に参加されました。(总经理参加了会。)
④ 今朝部長はとても早く来られました。(今天早晨部长来得很早。)
D 使役:未然形+せる、させる
① 母は妹を買い物に行かせる。(母亲让妹妹去买东西。)
② 看護婦は患者にお粥を食べさせる。(护士喂病人吃稀饭。)
③ 先生は学生にテキストを朗読させる。(老师让学生读课文)
④ 親戚が引越しなので、母は私を手伝いに来させました。(亲戚要搬家,母亲派我来帮忙。)
E 被役:未然形+される、させられる
① 行きたくないのですが、母に病院へ行かされました。(我不想去,但是被母亲逼着,去了医院。)
② 子供の時は食べたくない物を沢山食べさせられました。(下时候,有很多不想吃的东西,都被逼着吃了。)
③ 皆の仲間に入ると、したくないことまでさせられます。(和伙伴们在一起,被逼着干自己不想干的事情。)
④ 毎日学校に来させられますが、自分でも何をしているか分かりません。(每天被逼着上学,但是连自己都不知道在干什么。)
F 否定推量和否定意志(五段动词除外):
未然形+まい(其他还可以终止形+まい)
① こんな酸っぱい果物は二度と食べまい。(这样酸的水果,我再也不吃了。)
② 天気が悪いから、浅田さんは来まい。(因为天气不好,所以浅田先生不会来了。)
1 变化规则
① 五段动词:动词词尾变成其所在行的あ段字。
読む(よむ) 「词尾所在行:ま行、あ段字:ま」==よま
書く(かく) 「词尾所在行:か行、あ段字:か」==かか
死ぬ(しぬ)「词尾所在行:な行、あ段字:な」==しな
呼ぶ(呼ぶ)「词尾所在行:ば行、あ段字:ば」==よば
上がる(あがる)「词尾所在行:ら行、あ段字:ら」==あがら
切る(きる)「词尾所在行:ら行、あ段字:ら」==きら
② 一段动词:去掉动词词尾中的る。
食べる(たべる)「去掉动词词尾中的る」==たべ
起きる(おきる)「去掉动词词尾中的る」==おき
着る(きる)「去掉动词词尾中的る」==き
寝る(ねる)「去掉动词词尾中的る」==ね
③サ变动词:根据不同的需要,する分别变成し、さ、せ。
する==し、さ、せ。
勉強する==勉強し、勉強さ、勉強せ。
④カ变动词:くる变成こ。
来る(くる)==こ
2 各种实用例
A 否定:未然形+ない
① 私は本を読まない。(我不读书。)
② 田中さんは晩御飯を食べなかった。(田中没有吃晚饭。)
③ 毎日遊んで勉強しない。(每天玩,不学习。)
④今日は日曜日だから、山田さんは来ない。(今天是星期日,所以山田不来。)
B 被动、可能:未然形+れる、られる
① 弟は兄に殴られた。(弟弟被哥哥打了。)
② 眠くて、朝早く起きられない。(太困了,早晨不能起早。)
③ 授業中話をして先生に注意された。(上课说话,被老师批评了。)
④ 道路が渋滞で早く来られない。(道路拥挤,不能早来。)
C 敬语:未然形+れる、られる
① 小林先生はいつもお宅で新聞を読まれます。(小林先生总是在家读报纸。)
② 佐藤先生は学校まで遠いので、朝早く起きられます。(佐藤先生家离学校很远,所以每天早晨很早起床。)
③ 社長は会議に参加されました。(总经理参加了会。)
④ 今朝部長はとても早く来られました。(今天早晨部长来得很早。)
D 使役:未然形+せる、させる
① 母は妹を買い物に行かせる。(母亲让妹妹去买东西。)
② 看護婦は患者にお粥を食べさせる。(护士喂病人吃稀饭。)
③ 先生は学生にテキストを朗読させる。(老师让学生读课文)
④ 親戚が引越しなので、母は私を手伝いに来させました。(亲戚要搬家,母亲派我来帮忙。)
E 被役:未然形+される、させられる
① 行きたくないのですが、母に病院へ行かされました。(我不想去,但是被母亲逼着,去了医院。)
② 子供の時は食べたくない物を沢山食べさせられました。(下时候,有很多不想吃的东西,都被逼着吃了。)
③ 皆の仲間に入ると、したくないことまでさせられます。(和伙伴们在一起,被逼着干自己不想干的事情。)
④ 毎日学校に来させられますが、自分でも何をしているか分かりません。(每天被逼着上学,但是连自己都不知道在干什么。)
F 否定推量和否定意志(五段动词除外):
未然形+まい(其他还可以终止形+まい)
① こんな酸っぱい果物は二度と食べまい。(这样酸的水果,我再也不吃了。)
② 天気が悪いから、浅田さんは来まい。(因为天气不好,所以浅田先生不会来了。)
Apr
20
sina上看到的一篇文章:
希特勒何以使最理性民族陷入疯狂境地?
张放
最近,在美国一家相当大众性的媒介上,读到了一篇非常深刻但也非常引人入胜的文章。其中最重要一点,是讲述了弗洛依德与希特勒之间可能见过面,并暗示有可能弗洛依德曾施舍给希特勒的故事情节。更重要的是,文章就为什么会在德国,在德意志这个最理性的民族中间,产生出希特勒式的人物,从相当深的心理层面进行了入木三分的详尽分析。
其实,弗洛依德与爱恩斯坦同样伟大,都是改变人类命运的人物。弗洛依德开启了人类重新认识自我的新视角。他的很多思想理念现在在全世界范围内,仍然是最重要的。他的影响力一直持续不衰。关于他的思想与理念的诸多文章也一直不断地见诸于美国和西方很多报端媒体。
对于我们大多数人而言,“弗洛依德”这个名字所代表的,是个人心理学方面产生的挑战意味和重大争论与探讨。弗洛依德更应该是个伟大的发现者,他从人的头脑中发现了“无意识”和“俄狄普斯情结”的存在,并对其加以理论化。他成为人类历史上最著名也最有影响力的心理学大师。但他在人生的最后几年间,却把精力更多地花在研究文化与政治领域,而且相当富有成果。他尤其对像希特勒这样的独裁者的内心世界以及德国人的真实内心世界,进行了相当深刻的分析,提出了有震撼性的观点。
1938年3月14日,希特勒一身戎装,率领着成千上万的纳粹军队,冲入弗洛依德居住的维也纳市。弗洛依德对此一点也不感到惊奇。其实,对于这种基本教义派的独裁形式,弗洛依德早就开始注意研究并已经有相当深刻的认识。在他写的《集体心理学与个人分析》和《图腾与禁忌》两部十分深刻的书籍之中,弗洛依德早已经神准地预测到,人类历史上将出现希特勒式的人物。
最有趣的是,希特勒极有可能曾跟弗洛依德在大街上见过面。早在1909年,第一次世界大战即将爆发前夕,希特勒曾只身跑到维也纳,但却度过了一生中可能最不愉快的一段时光。那时,希特勒来维也纳,本梦想自己成为一个了不起的主流艺术家。但维也纳的艺术院校让他吃了闭门羹,他不只一次而是连续两次名落孙山。假设他真的考取了,人类历史就会完全重写了?但历史却没有什么假设。有段时间,希特勒几乎身无分文,无奈之下,只好露宿街头,甚至有几次不得不伸出肮脏的手,向过路的行人行乞,求施舍。1909年,弗洛依德应该刚刚从美国访问归来,那次访问美国相当成功,令弗洛依德深感骄傲。如果弗洛依德正好在维也纳大街上,从希特勒面前匆匆走过的话,那他一定会看到一个像只可恶的老鼠的家伙。希特勒眼中出现的弗洛依德,则一定是个看上去就是维也纳上层市民模样的人。希特勒最痛恨于心的,就是那些所谓的上层社会的男女们。还有一点,希特勒也一定不会搞错,他一准看得出来,这个从眼前路过的老家伙,是个犹太佬。那时,希特勒已经穿著破衣褴衫,鞋也露出脚趾。很有可能的是,他把手伸了出去,希望这个犹太佬怜悯他,给他几分钱混口吃的。至于弗洛依德给还是没给(估计他会给,因为他算那种心地善良的人),现在已经无足轻重了。这次可能的邂逅和点滴施舍,并不能使希特勒对上层人和犹太人的刻骨仇恨的怒火平息下来。
1938年3月,这只大街上的老鼠回来了。不过,今非昔比,他此时衣冠楚楚,站在敞棚奔驰车上,在维也纳的大街上耀武扬威地穿过,左手扶着挡风玻璃,右手朝着成千上万的维也纳市民行着纳粹礼,以表达奥地利这个弹丸之地给收入第三帝国版图后的喜悦之情。弗洛依德在那个3月的日记中写到:“奥地利,完了。”
这个时候,希特勒正值壮年,而弗洛依德已经进入耄耄之年,而且已经身患癌症。一年半后,弗洛依德在伦敦病逝了。
1938年春天,尽管弗洛依德已经病得非常严重,但他拒绝用药,除偶尔吃点阿斯匹林。他不希望自己丧失思考和写作的能力。也正因为如此,他需要一颗相当清醒的头脑。他拒绝使用吗啡,也不想借酒抒缓病痛。不过,他认为一个人这样做,还有更深层的含义:只有这样,才能保持一直远离宗教。他一生都是个无神论者;只有这样,才能远离浪漫的爱情。他对浪漫爱情有个定义,叫作“对性欲对象过度夸大的过程”;只有这样,才能远离那个现在耀武扬威穿行于维也纳大街而当年却是大街上的老鼠带来的政治环境。
那么,为什么充满理性的德意志民族这么热衷于投入到希特勒的怀抱?甚至不顾一切后果地、极具破坏性地跟从希特勒呢?他们又为什么对所有能让集体沉醉的东西如痴如狂地追逐呢?弗洛依德对此已经有了答案,他对希特勒这种人物能这样左右德国人的思维,做了很准确的“把脉”。
弗洛依德的整个思想体系中,最核心部分就是:从根本意义上说,人是一个不能达到统一和谐的动物。人的灵魂,并不是个完整体,而是分成若干部分的。这各个部分又彼此冲突矛盾。弗洛依德将人的灵魂分成了三个部分。第一,纯粹的欲望。他设定为“id”,或叫“它”。这个“它”永远不停地向世界伸手要着,要着,要着。在“它”面前,没有“不行”二字。“它”根本不理会说“不”的意思是什么。另外一个部分,就是“超自我”。这个“超自我”扮演着官方的或者说是社会伦理意义上的“代表”身份。事实上,这个“超自我”一直不断地惩罚着“它”,因为“它”太贪得无厌。第三部分就是“自我”。这个“自我”在刚才所说的“超自我”和“它”中间进行斡旋。但困难重重,因为那两者都想越越“自我”自行其事。
“超自我”和“它”一般情况下,是在人的无意识中发挥着作用。于是,那个夹在中间的“自我”所扮演的角色,就变得非常可怜了,斡旋之余,“自我”还得应付外面充满敌意的世界。这就是为什么弗洛依德将人的一生描述成“永远冲突的过程”。弗洛依德非常理解“自我”的尴尬境地,称这个“自我”的家伙,要同时“服侍三个主人,还一直受到三种危险的威胁:来自外部世界的;来自‘它’的,和来自‘超自我’的”。“因此,人就产生了三种焦虑,不过,也正是焦虑,才最好地表达了人想躲避危险的可能性。”
面对这永远的冲突,或永远痛苦不堪的焦虑,我们应该怎么办呢?弗洛依德说,事实上,有很多人都提出过各种不同的解决问题的方案。但大多数解决方案,在弗洛依德看来,都只是令人沉迷的别种形式。不过是在“超自我”上面进行一点加工处理,让“超自我”再另外增添些忍受功能罢了。比如,喝杯酒什么的,弗洛依德说,酒精可以使“超自我”干预“它”的诸多要求的强度,变得减缓。再比如,谈恋爱,他说,也同样具有减缓功能。谈一次轰轰烈烈的恋爱,就可以使“自我”充满对恋爱对象的各种期待与评判,使“超自我”不再背负重荷。
也就是说,恋爱对象替代了“超自我”。至少可以有一段时间是这样的。恋爱对象身上被充满了最神奇的光芒四射的赞美之词,也让自己身心充满了最神奇的魔力。突然之间,内心冲突大大减弱。刚才讨论过的不可能成为一体的分裂的灵魂,一下子变成一个整体,也一下子充满了快乐的源泉。
弗洛依德认为,具有绝对权威的领导者,其身边簇拥着成千上万的人群,这种关系说穿了,就是一种情爱关系。但在这一点上,弗洛依德显然不如希特勒来得直接。希特勒直截了当地说,他在向德国民众发表演说时,就是在跟他们做爱!那么,当德国的民众被这个独裁者说“晕了头”,发生了恋爱时常出现的“被催眠”的情形时,(用我们时下最时髦的话说,被“忽悠”到不知所以时,)会发生什么呢?最可能发生的就是这个独裁者取代了上面表述过的,德意志人心中的那个“超自我”,并一直呆在那里。他给民众提供了一种崭新的心理药方。这个“超自我”本来一直处于人的无意识之中。但希特勒这个“集体超自我”人物,却清晰可见,他用自己的价值观完全取代了民众的价值观。他通过各种近乎催眠或者叫“做爱”方式的演讲,透过非常神秘的语言方式,将不同人群中的各种不同观点和价值观统统给扫清了,或者说给统一了,因为那些不同的东西,让人产生焦虑,而没有人喜欢焦虑。
希特勒最大成功之处,就是他利用了德意志人对自己民族最具信心,内心深处不喜欢犹太人种,希望德意志民族走向更大辉煌的心理。他通过自己独特的方式,使这种情绪得到宣泄。其实,人的内心原有的存在于无意识中的“超自我”,是极力反对暴力,偷盗和毁坏的。可是,这个原来的东西已经被崭新的“超自我”,也就是那位独裁者所取代。他却允许人们实施暴力,偷盗和毁坏,当然,一切都是在冠冕堂皇的言辞下进行的。
所以,当纳粹德军到达维也纳后,很多原本非常温和、宽厚善良心肠、深具容忍别人精神、自称是世界公民的维也纳人,突然间像换了个人似的,猛然冲向了自己的犹太邻居那里。他们闯进犹太人的家中,将自己喜欢的一切东西,公开地偷走。他们强迫犹太人先是用刷子然后再用手,将街道上的一些政治宣传口号清除掉。他们这样做的时候,心中没有为自己的行为感到一丝一毫的难过与羞耻,正相反,他们觉得非常正确,没有什么犯罪感。因为他们从内心深处认为,自己的所作所为,非常符合那位新“超自我”人物要求的标准。他们摒弃掉旧的“超自我”,换上了新人:希特勒!
希特勒抵达维也纳那天,一伙纳粹军人冲进了弗洛依德的家里。他们把弗洛依德的家,底朝天地翻腾了一遍,抢走了一大笔钱。有个家伙还说,“我还从来没有一次弄到这么多钱呀。”而弗洛依德则在一边冷冷地注视着这伙强盗,他心中太明白他们为什么要这么干了。他们走了,老人拖着病弱的身体,从他给病人瞧病的房间里出来,以他惯有的心理大师的目光,盯视着那些混蛋们的背影消失在尽头。
弗洛依德最后的日子里,他越来越关注人追求内心平静的问题。也就是用什么样的东西,可以更简单更清晰也更好地替代内心中的那个“超自我”。人可能天生就渴望有个什么强人,来解脱其于苦难之中,帮其指出谁是宿敌,将其大量精力引导到更值得的事情上,并给端出更好的东西,不仅仅是美酒和爱情,总之,人需要的,是一个完整的自我,完整的灵魂。
而这个强人必须看起来就很有一种大家风范,他一定要非常、非常有自信心,根本不需要任何人的帮助,一切都靠他个人魅力来完成。有时,他甚至应该向上帝叫板,但也应该更会利用上帝这种资源。他一定要向德意志民众承诺,解救他们于困惑之中,并使每个人的灵魂,达到完整状态。希特勒出色地完成了这个任务。但所付出的代价却非常昂贵。因为他承诺实现的,必然包含仇恨与暴力。
当一个国家受到别人的威胁时,那么,全民团结起来就成了一种最紧迫的任务,全民一起用任何可能的形式向敌对势力反攻,也成了必然。但这种同仇敌忾也同样会导致敌对势力成为一个完整体。人们这时一定会尽全力来寻找一个强人,人们从此不再争辩什么,也不再彼此矛盾。而这时,会发生什么呢?一场原教旨主义的战争也就迫在眉睫了。但这场战争的敌对双方,弗洛依德认为,不会有任何赢家存在。而这就是德国当年的真实处境。德国人得到了希特勒,德意志人陷入疯狂境地,失去了理性,最后输掉了战争。但也同时把最丑陋的一面,显示给了世人看。
希特勒何以使最理性民族陷入疯狂境地?
张放
最近,在美国一家相当大众性的媒介上,读到了一篇非常深刻但也非常引人入胜的文章。其中最重要一点,是讲述了弗洛依德与希特勒之间可能见过面,并暗示有可能弗洛依德曾施舍给希特勒的故事情节。更重要的是,文章就为什么会在德国,在德意志这个最理性的民族中间,产生出希特勒式的人物,从相当深的心理层面进行了入木三分的详尽分析。
其实,弗洛依德与爱恩斯坦同样伟大,都是改变人类命运的人物。弗洛依德开启了人类重新认识自我的新视角。他的很多思想理念现在在全世界范围内,仍然是最重要的。他的影响力一直持续不衰。关于他的思想与理念的诸多文章也一直不断地见诸于美国和西方很多报端媒体。
对于我们大多数人而言,“弗洛依德”这个名字所代表的,是个人心理学方面产生的挑战意味和重大争论与探讨。弗洛依德更应该是个伟大的发现者,他从人的头脑中发现了“无意识”和“俄狄普斯情结”的存在,并对其加以理论化。他成为人类历史上最著名也最有影响力的心理学大师。但他在人生的最后几年间,却把精力更多地花在研究文化与政治领域,而且相当富有成果。他尤其对像希特勒这样的独裁者的内心世界以及德国人的真实内心世界,进行了相当深刻的分析,提出了有震撼性的观点。
1938年3月14日,希特勒一身戎装,率领着成千上万的纳粹军队,冲入弗洛依德居住的维也纳市。弗洛依德对此一点也不感到惊奇。其实,对于这种基本教义派的独裁形式,弗洛依德早就开始注意研究并已经有相当深刻的认识。在他写的《集体心理学与个人分析》和《图腾与禁忌》两部十分深刻的书籍之中,弗洛依德早已经神准地预测到,人类历史上将出现希特勒式的人物。
最有趣的是,希特勒极有可能曾跟弗洛依德在大街上见过面。早在1909年,第一次世界大战即将爆发前夕,希特勒曾只身跑到维也纳,但却度过了一生中可能最不愉快的一段时光。那时,希特勒来维也纳,本梦想自己成为一个了不起的主流艺术家。但维也纳的艺术院校让他吃了闭门羹,他不只一次而是连续两次名落孙山。假设他真的考取了,人类历史就会完全重写了?但历史却没有什么假设。有段时间,希特勒几乎身无分文,无奈之下,只好露宿街头,甚至有几次不得不伸出肮脏的手,向过路的行人行乞,求施舍。1909年,弗洛依德应该刚刚从美国访问归来,那次访问美国相当成功,令弗洛依德深感骄傲。如果弗洛依德正好在维也纳大街上,从希特勒面前匆匆走过的话,那他一定会看到一个像只可恶的老鼠的家伙。希特勒眼中出现的弗洛依德,则一定是个看上去就是维也纳上层市民模样的人。希特勒最痛恨于心的,就是那些所谓的上层社会的男女们。还有一点,希特勒也一定不会搞错,他一准看得出来,这个从眼前路过的老家伙,是个犹太佬。那时,希特勒已经穿著破衣褴衫,鞋也露出脚趾。很有可能的是,他把手伸了出去,希望这个犹太佬怜悯他,给他几分钱混口吃的。至于弗洛依德给还是没给(估计他会给,因为他算那种心地善良的人),现在已经无足轻重了。这次可能的邂逅和点滴施舍,并不能使希特勒对上层人和犹太人的刻骨仇恨的怒火平息下来。
1938年3月,这只大街上的老鼠回来了。不过,今非昔比,他此时衣冠楚楚,站在敞棚奔驰车上,在维也纳的大街上耀武扬威地穿过,左手扶着挡风玻璃,右手朝着成千上万的维也纳市民行着纳粹礼,以表达奥地利这个弹丸之地给收入第三帝国版图后的喜悦之情。弗洛依德在那个3月的日记中写到:“奥地利,完了。”
这个时候,希特勒正值壮年,而弗洛依德已经进入耄耄之年,而且已经身患癌症。一年半后,弗洛依德在伦敦病逝了。
1938年春天,尽管弗洛依德已经病得非常严重,但他拒绝用药,除偶尔吃点阿斯匹林。他不希望自己丧失思考和写作的能力。也正因为如此,他需要一颗相当清醒的头脑。他拒绝使用吗啡,也不想借酒抒缓病痛。不过,他认为一个人这样做,还有更深层的含义:只有这样,才能保持一直远离宗教。他一生都是个无神论者;只有这样,才能远离浪漫的爱情。他对浪漫爱情有个定义,叫作“对性欲对象过度夸大的过程”;只有这样,才能远离那个现在耀武扬威穿行于维也纳大街而当年却是大街上的老鼠带来的政治环境。
那么,为什么充满理性的德意志民族这么热衷于投入到希特勒的怀抱?甚至不顾一切后果地、极具破坏性地跟从希特勒呢?他们又为什么对所有能让集体沉醉的东西如痴如狂地追逐呢?弗洛依德对此已经有了答案,他对希特勒这种人物能这样左右德国人的思维,做了很准确的“把脉”。
弗洛依德的整个思想体系中,最核心部分就是:从根本意义上说,人是一个不能达到统一和谐的动物。人的灵魂,并不是个完整体,而是分成若干部分的。这各个部分又彼此冲突矛盾。弗洛依德将人的灵魂分成了三个部分。第一,纯粹的欲望。他设定为“id”,或叫“它”。这个“它”永远不停地向世界伸手要着,要着,要着。在“它”面前,没有“不行”二字。“它”根本不理会说“不”的意思是什么。另外一个部分,就是“超自我”。这个“超自我”扮演着官方的或者说是社会伦理意义上的“代表”身份。事实上,这个“超自我”一直不断地惩罚着“它”,因为“它”太贪得无厌。第三部分就是“自我”。这个“自我”在刚才所说的“超自我”和“它”中间进行斡旋。但困难重重,因为那两者都想越越“自我”自行其事。
“超自我”和“它”一般情况下,是在人的无意识中发挥着作用。于是,那个夹在中间的“自我”所扮演的角色,就变得非常可怜了,斡旋之余,“自我”还得应付外面充满敌意的世界。这就是为什么弗洛依德将人的一生描述成“永远冲突的过程”。弗洛依德非常理解“自我”的尴尬境地,称这个“自我”的家伙,要同时“服侍三个主人,还一直受到三种危险的威胁:来自外部世界的;来自‘它’的,和来自‘超自我’的”。“因此,人就产生了三种焦虑,不过,也正是焦虑,才最好地表达了人想躲避危险的可能性。”
面对这永远的冲突,或永远痛苦不堪的焦虑,我们应该怎么办呢?弗洛依德说,事实上,有很多人都提出过各种不同的解决问题的方案。但大多数解决方案,在弗洛依德看来,都只是令人沉迷的别种形式。不过是在“超自我”上面进行一点加工处理,让“超自我”再另外增添些忍受功能罢了。比如,喝杯酒什么的,弗洛依德说,酒精可以使“超自我”干预“它”的诸多要求的强度,变得减缓。再比如,谈恋爱,他说,也同样具有减缓功能。谈一次轰轰烈烈的恋爱,就可以使“自我”充满对恋爱对象的各种期待与评判,使“超自我”不再背负重荷。
也就是说,恋爱对象替代了“超自我”。至少可以有一段时间是这样的。恋爱对象身上被充满了最神奇的光芒四射的赞美之词,也让自己身心充满了最神奇的魔力。突然之间,内心冲突大大减弱。刚才讨论过的不可能成为一体的分裂的灵魂,一下子变成一个整体,也一下子充满了快乐的源泉。
弗洛依德认为,具有绝对权威的领导者,其身边簇拥着成千上万的人群,这种关系说穿了,就是一种情爱关系。但在这一点上,弗洛依德显然不如希特勒来得直接。希特勒直截了当地说,他在向德国民众发表演说时,就是在跟他们做爱!那么,当德国的民众被这个独裁者说“晕了头”,发生了恋爱时常出现的“被催眠”的情形时,(用我们时下最时髦的话说,被“忽悠”到不知所以时,)会发生什么呢?最可能发生的就是这个独裁者取代了上面表述过的,德意志人心中的那个“超自我”,并一直呆在那里。他给民众提供了一种崭新的心理药方。这个“超自我”本来一直处于人的无意识之中。但希特勒这个“集体超自我”人物,却清晰可见,他用自己的价值观完全取代了民众的价值观。他通过各种近乎催眠或者叫“做爱”方式的演讲,透过非常神秘的语言方式,将不同人群中的各种不同观点和价值观统统给扫清了,或者说给统一了,因为那些不同的东西,让人产生焦虑,而没有人喜欢焦虑。
希特勒最大成功之处,就是他利用了德意志人对自己民族最具信心,内心深处不喜欢犹太人种,希望德意志民族走向更大辉煌的心理。他通过自己独特的方式,使这种情绪得到宣泄。其实,人的内心原有的存在于无意识中的“超自我”,是极力反对暴力,偷盗和毁坏的。可是,这个原来的东西已经被崭新的“超自我”,也就是那位独裁者所取代。他却允许人们实施暴力,偷盗和毁坏,当然,一切都是在冠冕堂皇的言辞下进行的。
所以,当纳粹德军到达维也纳后,很多原本非常温和、宽厚善良心肠、深具容忍别人精神、自称是世界公民的维也纳人,突然间像换了个人似的,猛然冲向了自己的犹太邻居那里。他们闯进犹太人的家中,将自己喜欢的一切东西,公开地偷走。他们强迫犹太人先是用刷子然后再用手,将街道上的一些政治宣传口号清除掉。他们这样做的时候,心中没有为自己的行为感到一丝一毫的难过与羞耻,正相反,他们觉得非常正确,没有什么犯罪感。因为他们从内心深处认为,自己的所作所为,非常符合那位新“超自我”人物要求的标准。他们摒弃掉旧的“超自我”,换上了新人:希特勒!
希特勒抵达维也纳那天,一伙纳粹军人冲进了弗洛依德的家里。他们把弗洛依德的家,底朝天地翻腾了一遍,抢走了一大笔钱。有个家伙还说,“我还从来没有一次弄到这么多钱呀。”而弗洛依德则在一边冷冷地注视着这伙强盗,他心中太明白他们为什么要这么干了。他们走了,老人拖着病弱的身体,从他给病人瞧病的房间里出来,以他惯有的心理大师的目光,盯视着那些混蛋们的背影消失在尽头。
弗洛依德最后的日子里,他越来越关注人追求内心平静的问题。也就是用什么样的东西,可以更简单更清晰也更好地替代内心中的那个“超自我”。人可能天生就渴望有个什么强人,来解脱其于苦难之中,帮其指出谁是宿敌,将其大量精力引导到更值得的事情上,并给端出更好的东西,不仅仅是美酒和爱情,总之,人需要的,是一个完整的自我,完整的灵魂。
而这个强人必须看起来就很有一种大家风范,他一定要非常、非常有自信心,根本不需要任何人的帮助,一切都靠他个人魅力来完成。有时,他甚至应该向上帝叫板,但也应该更会利用上帝这种资源。他一定要向德意志民众承诺,解救他们于困惑之中,并使每个人的灵魂,达到完整状态。希特勒出色地完成了这个任务。但所付出的代价却非常昂贵。因为他承诺实现的,必然包含仇恨与暴力。
当一个国家受到别人的威胁时,那么,全民团结起来就成了一种最紧迫的任务,全民一起用任何可能的形式向敌对势力反攻,也成了必然。但这种同仇敌忾也同样会导致敌对势力成为一个完整体。人们这时一定会尽全力来寻找一个强人,人们从此不再争辩什么,也不再彼此矛盾。而这时,会发生什么呢?一场原教旨主义的战争也就迫在眉睫了。但这场战争的敌对双方,弗洛依德认为,不会有任何赢家存在。而这就是德国当年的真实处境。德国人得到了希特勒,德意志人陷入疯狂境地,失去了理性,最后输掉了战争。但也同时把最丑陋的一面,显示给了世人看。
Apr
19
Mysql 5.0.22 Cluster for RedHat AS4-U2
最近看到过很多关于cluster的资料,一直在研究linux系统级的负载均衡和高可用,但是还没有完全成功,只是实现了一些简单的服务;今天在搜集资料中看到有关mysql的cluster,看上去不是很复杂,就花了一个下午的时间研究研究,参考了N anu前辈的MySQL集群配置步骤,一个简单的集群算是成功了。但是有一点我没搞懂,是不是mysql集群配置完成后,只能同步数据库中的表,而不能同步整个库?请高手指点一二,谢谢!
一.实验环境
1. Linux操作系统版本. RedHat AS4-U2
2. Mysql数据库版本 mysql-max-5.0.22-linux-i686-glibc23.tar.gz
共三台机器PC安装了RedHat AS4-U2版本,首先保证把系统中没有一个包带有mysql的,有的话就rpm –e .
PC1 IP:192.168.10.196
PC2 IP:192.168.10.197
PC3 IP:192.168.10.198
二.安装操作步骤
1. 在PC1、PC2上需要执行如下的命令,请按照顺序来执行:
mv mysql-max-5.0.22-linux-i686-glibc23.tar.gz /usr/local/
cd /usr/local/
tar zxvf mysql-max-5.0.22-linux-i686-glibc23.tar.gz
rm mysql-max-5.0.22-linux-i686-glibc23.tar.gz
mv mysql-max-5.0.22-linux-i686-glibc23 mysql
groupadd mysql
useradd -g mysql mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R mysql:mysql .
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
vi /etc/my.cnf
找到myisam_sort_buffer_size = 8M这一行,然后在后面添加如下的两行:
ndbcluster
ndb-connectstring=192.168.10.198
然后到my.cnf的最后一行增加以下六行:
[ndbd]
connect-string=192.168.10.198
[ndb_mgm]
connect-string=192.168.10.198
[ndb_mgmd]
config-file=/var/lib/mysql-cluster
修改完毕后,保存推出!
mkdir /var/lib/mysql-cluster
2.在PC3上执行如下的命令,请按照顺序执行:
mv mysql-max-5.0.22-linux-i686-glibc23.tar.gz /usr/local/
cd /usr/local/
tar zxvf mysql-max-5.0.22-linux-i686-glibc23.tar.gz
rm mysql-max-5.0.22-linux-i686-glibc23.tar.gz
mv mysql-max-5.0.22-linux-i686-glibc23 mysql
groupadd mysql
useradd -g mysql mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R mysql:mysql .
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
vi /etc/my.cnf
找到myisam_sort_buffer_size = 8M这一行,然后在后面添加如下的两行:
ndbcluster
ndb-connectstring=192.168.10.198
然后到my.cnf的最后一行增加以下六行:
[ndbd]
connect-string=192.168.10.198
[ndb_mgm]
connect-string=192.168.10.198
[ndb_mgmd]
config-file=/var/lib/mysql-cluster
修改完毕后,保存推出!
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
touch config.ini
vi config.ini 键入如下信息:(半个字符都不能错)
[NDBD DEFAULT]
NoOfReplicas= 2
DataDir= /var/lib/mysql-cluster
[NDB_MGMD]
Hostname= 192.168.10.198
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName= 192.168.10.197
[NDBD]
HostName= 192.168.10.196
[MYSQLD]
[MYSQLD]
[MYSQLD]
保存退出!
3.到此为止整个的配置步骤算是完成,下面需要设置一些快捷命令:
在PC1、PC2上需要输入以下命令:
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig –add mysqld
ln -s /usr/local/mysql/bin/ndbd /usr/bin/ndbd
vi /etc/rc.local
添加一行ndbd后保存退出
在PC3上需要输入以下命令:
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig –add mysqld
ln -s /usr/local/mysql/bin/ndb_mgm /usr/bin/ndb_mgm
ln -s /usr/local/mysql/bin/ndb_mgmd /usr/bin/ndb_mgmd
vi /etc/rc.local后添加如下一行
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
保存退出!
三.启动服务
PC3需要执行的命令如下:
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
service mysqld start
PC1、PC2需要执行的命令如下:
/usr/local/mysql/bin/ndbd --initial 注:只在第一次启动ndbd时使用--initial参数
service mysqld start
四.测试与检查
PC3需要执行的命令如下:
ndb_mgm
执行如下命令以及显示如下信息则说明工作正常!
[root@lzj local]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.10.198:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.10.197 (Version: 5.0.22, Nodegroup: 0, Master)
id=3 @192.168.10.196 (Version: 5.0.22, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.10.198 (Version: 5.0.22)
[mysqld(API)] 3 node(s)
id=4 @192.168.10.198 (Version: 5.0.22)
id=5 @192.168.10.197 (Version: 5.0.22)
id=6 @192.168.10.196 (Version: 5.0.22)
ndb_mgm>
测试的时候则需要创建表,看是否三台机器的mysql是否能够同步。
五.注意事项
1. mysql cluster在启动过程中必须提前启动管理节点服务器,等管理节点启动成功后,再启动其它节点。
2.关闭整个集群的时候最好最后关闭管理节点
3.管理节点宕机后,剩下的某台主机再宕机后,这样就失去了集群的意义了。管理节点最好是24小时待命。
最近看到过很多关于cluster的资料,一直在研究linux系统级的负载均衡和高可用,但是还没有完全成功,只是实现了一些简单的服务;今天在搜集资料中看到有关mysql的cluster,看上去不是很复杂,就花了一个下午的时间研究研究,参考了N anu前辈的MySQL集群配置步骤,一个简单的集群算是成功了。但是有一点我没搞懂,是不是mysql集群配置完成后,只能同步数据库中的表,而不能同步整个库?请高手指点一二,谢谢!
一.实验环境
1. Linux操作系统版本. RedHat AS4-U2
2. Mysql数据库版本 mysql-max-5.0.22-linux-i686-glibc23.tar.gz
共三台机器PC安装了RedHat AS4-U2版本,首先保证把系统中没有一个包带有mysql的,有的话就rpm –e .
PC1 IP:192.168.10.196
PC2 IP:192.168.10.197
PC3 IP:192.168.10.198
二.安装操作步骤
1. 在PC1、PC2上需要执行如下的命令,请按照顺序来执行:
mv mysql-max-5.0.22-linux-i686-glibc23.tar.gz /usr/local/
cd /usr/local/
tar zxvf mysql-max-5.0.22-linux-i686-glibc23.tar.gz
rm mysql-max-5.0.22-linux-i686-glibc23.tar.gz
mv mysql-max-5.0.22-linux-i686-glibc23 mysql
groupadd mysql
useradd -g mysql mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R mysql:mysql .
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
vi /etc/my.cnf
找到myisam_sort_buffer_size = 8M这一行,然后在后面添加如下的两行:
ndbcluster
ndb-connectstring=192.168.10.198
然后到my.cnf的最后一行增加以下六行:
[ndbd]
connect-string=192.168.10.198
[ndb_mgm]
connect-string=192.168.10.198
[ndb_mgmd]
config-file=/var/lib/mysql-cluster
修改完毕后,保存推出!
mkdir /var/lib/mysql-cluster
2.在PC3上执行如下的命令,请按照顺序执行:
mv mysql-max-5.0.22-linux-i686-glibc23.tar.gz /usr/local/
cd /usr/local/
tar zxvf mysql-max-5.0.22-linux-i686-glibc23.tar.gz
rm mysql-max-5.0.22-linux-i686-glibc23.tar.gz
mv mysql-max-5.0.22-linux-i686-glibc23 mysql
groupadd mysql
useradd -g mysql mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R mysql:mysql .
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
vi /etc/my.cnf
找到myisam_sort_buffer_size = 8M这一行,然后在后面添加如下的两行:
ndbcluster
ndb-connectstring=192.168.10.198
然后到my.cnf的最后一行增加以下六行:
[ndbd]
connect-string=192.168.10.198
[ndb_mgm]
connect-string=192.168.10.198
[ndb_mgmd]
config-file=/var/lib/mysql-cluster
修改完毕后,保存推出!
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
touch config.ini
vi config.ini 键入如下信息:(半个字符都不能错)
[NDBD DEFAULT]
NoOfReplicas= 2
DataDir= /var/lib/mysql-cluster
[NDB_MGMD]
Hostname= 192.168.10.198
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName= 192.168.10.197
[NDBD]
HostName= 192.168.10.196
[MYSQLD]
[MYSQLD]
[MYSQLD]
保存退出!
3.到此为止整个的配置步骤算是完成,下面需要设置一些快捷命令:
在PC1、PC2上需要输入以下命令:
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig –add mysqld
ln -s /usr/local/mysql/bin/ndbd /usr/bin/ndbd
vi /etc/rc.local
添加一行ndbd后保存退出
在PC3上需要输入以下命令:
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig –add mysqld
ln -s /usr/local/mysql/bin/ndb_mgm /usr/bin/ndb_mgm
ln -s /usr/local/mysql/bin/ndb_mgmd /usr/bin/ndb_mgmd
vi /etc/rc.local后添加如下一行
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
保存退出!
三.启动服务
PC3需要执行的命令如下:
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
service mysqld start
PC1、PC2需要执行的命令如下:
/usr/local/mysql/bin/ndbd --initial 注:只在第一次启动ndbd时使用--initial参数
service mysqld start
四.测试与检查
PC3需要执行的命令如下:
ndb_mgm
执行如下命令以及显示如下信息则说明工作正常!
[root@lzj local]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.10.198:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.10.197 (Version: 5.0.22, Nodegroup: 0, Master)
id=3 @192.168.10.196 (Version: 5.0.22, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.10.198 (Version: 5.0.22)
[mysqld(API)] 3 node(s)
id=4 @192.168.10.198 (Version: 5.0.22)
id=5 @192.168.10.197 (Version: 5.0.22)
id=6 @192.168.10.196 (Version: 5.0.22)
ndb_mgm>
测试的时候则需要创建表,看是否三台机器的mysql是否能够同步。
五.注意事项
1. mysql cluster在启动过程中必须提前启动管理节点服务器,等管理节点启动成功后,再启动其它节点。
2.关闭整个集群的时候最好最后关闭管理节点
3.管理节点宕机后,剩下的某台主机再宕机后,这样就失去了集群的意义了。管理节点最好是24小时待命。
Apr
19
实现基于Memcache存储的Session类
作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache扩展,能够支持分布式的Memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。
说明:以下代码基于Memcache来保存Session数据,客户端必须安装有PHP的Memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。
作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache扩展,能够支持分布式的Memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。
说明:以下代码基于Memcache来保存Session数据,客户端必须安装有PHP的Memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。
引用
//===========================================
// 程序:Memcache-Based Session Class
// 功能:基于Memcache存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-23
//===========================================
/**
* 类名: FileSession Class
* 功能: 自主实现基于Memcache存储的 Session 功能
* 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
* 然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
* 然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
*
* 本方式适合Memcache内存方式存储Session数据的方式,同时如果构建分布式的Memcache服务器,
* 能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
* 注意: 本类必须要求PHP安装了Memcache扩展, 获取Memcache扩展请访问: http://pecl.php.net
*/
class MemcacheSession
{
var $sessId = '';
var $sessKeyPrefix = 'sess_';
var $sessExpireTime = 86400;
var $cookieName = '__SessHandler';
var $cookieExpireTime = '';
var $memConfig = array('host'=>'192.168.0.200', 'port'=>11211);
var $memObject = null;
/**
* 构造函数
*
* @param bool $isInit - 是否实例化对象的时候启动Session
*/
function MemcacheSession($isInit = false){
if ($isInit){
$this->start();
}
}
//-------------------------
// 外部方法
//-------------------------
/**
* 启动Session操作
*
* @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
*/
function start($expireTime = 0){
$sessId = $_COOKIE[$this->cookieName];
if (!$sessId){
$this->sessId = $this->_getId();
$this->cookieExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
setcookie($this->cookieName, $this->sessId, $this->cookieExpireTime, "/", '');
$this->_initMemcacheObj();
$_SESSION = array();
$this->_saveSession();
} else {
$this->sessId = $sessId;
$_SESSION = $this->_getSession($sessId);
}
}
/**
* 判断某个Session变量是否注册
*
* @param string $varName -
* @return bool 存在返回true, 不存在返回false
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return true;
}
/**
* 注册一个Session变量
*
* @param string $varName - 需要注册成Session的变量名
* @param mixed $varValue - 注册成Session变量的值
* @return bool - 该变量名已经存在返回false, 注册成功返回true
*/
function register($varName, $varValue){
if (isset($_SESSION[$varName])){
return false;
}
$_SESSION[$varName] = $varValue;
$this->_saveSession();
return true;
}
/**
* 销毁一个已注册的Session变量
*
* @param string $varName - 需要销毁的Session变量名
* @return bool 销毁成功返回true
*/
function unregister($varName){
unset($_SESSION[$varName]);
$this->_saveSession();
return true;
}
/**
* 销毁所有已经注册的Session变量
*
* @return 销毁成功返回true
*/
function destroy(){
$_SESSION = array();
$this->_saveSession();
return true;
}
/**
* 获取一个已注册的Session变量值
*
* @param string $varName - Session变量的名称
* @return mixed - 不存在的变量返回false, 存在变量返回变量值
*/
function get($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return $_SESSION[$varName];
}
/**
* 获取所有Session变量
*
* @return array - 返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION;
}
/**
* 获取当前的Session ID
*
* @return string 获取的SessionID
*/
function getSid(){
return $this->sessId;
}
/**
* 获取Memcache的配置信息
*
* @return array Memcache配置数组信息
*/
function getMemConfig(){
return $this->memConfig;
}
/**
* 设置Memcache的配置信息
*
* @param string $host - Memcache服务器的IP
* @param int $port - Memcache服务器的端口
*/
function setMemConfig($host, $port){
$this->memConfig = array('host'=>$host, 'port'=>$port);
}
//-------------------------
// 内部接口
//-------------------------
/**
* 生成一个Session ID
*
* @return string 返回一个32位的Session ID
*/
function _getId(){
return md5(uniqid(microtime()));
}
/**
* 获取一个保存在Memcache的Session Key
*
* @param string $sessId - 是否指定Session ID
* @return string 获取到的Session Key
*/
function _getSessKey($sessId = ''){
$sessKey = ($sessId == '') ? $this->sessKeyPrefix.$this->sessId : $this->sessKeyPrefix.$sessId;
return $sessKey;
}
/**
* 检查保存Session数据的路径是否存在
*
* @return bool 成功返回true
*/
function _initMemcacheObj(){
if (!class_exists('Memcache') || !function_exists('memcache_connect')){
$this->_showMessage('Failed: Memcache extension not install, please from http://pecl.php.net download and install');
}
if ($this->memObject && is_object($this->memObject)){
return true;
}
$mem = new Memcache;
if (!@$mem->connect($this->memConfig['host'], $this->memConfig['port'])){
$this->_showMessage('Failed: Connect memcache host '. $this->memConfig['host'] .':'. $this->memConfig['port'] .' failed');
}
$this->memObject = $mem;
return true;
}
/**
* 获取Session文件中的数据
*
* @param string $sessId - 需要获取Session数据的SessionId
* @return unknown
*/
function _getSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
$sessData = $this->memObject->get($sessKey);
if (!is_array($sessData) || empty($sessData)){
$this->_showMessage('Failed: Session ID '. $sessKey .' session data not exists');
}
return $sessData;
}
/**
* 把当前的Session数据保存到Memcache
*
* @param string $sessId - Session ID
* @return 成功返回true
*/
function _saveSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
if (empty($_SESSION)){
$ret = @$this->memObject->set($sessKey, $_SESSION, false, $this->sessExpireTime);
}else{
$ret = @$this->memObject->replace($sessKey, $_SESSION, false, $this->sessExpireTime);
}
if (!$ret){
$this->_showMessage('Failed: Save sessiont data failed, please check memcache server');
}
return true;
}
/**
* 显示提示信息
*
* @param string $strMessage - 需要显示的信息内容
* @param bool $isFailed - 是否是失败信息, 缺省是true
*/
function _showMessage($strMessage, $isFailed = true){
if ($isFailed){
exit($strMessage);
}
echo $strMessage;
}
}
?>
// 程序:Memcache-Based Session Class
// 功能:基于Memcache存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-23
//===========================================
/**
* 类名: FileSession Class
* 功能: 自主实现基于Memcache存储的 Session 功能
* 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
* 然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
* 然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
*
* 本方式适合Memcache内存方式存储Session数据的方式,同时如果构建分布式的Memcache服务器,
* 能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
* 注意: 本类必须要求PHP安装了Memcache扩展, 获取Memcache扩展请访问: http://pecl.php.net
*/
class MemcacheSession
{
var $sessId = '';
var $sessKeyPrefix = 'sess_';
var $sessExpireTime = 86400;
var $cookieName = '__SessHandler';
var $cookieExpireTime = '';
var $memConfig = array('host'=>'192.168.0.200', 'port'=>11211);
var $memObject = null;
/**
* 构造函数
*
* @param bool $isInit - 是否实例化对象的时候启动Session
*/
function MemcacheSession($isInit = false){
if ($isInit){
$this->start();
}
}
//-------------------------
// 外部方法
//-------------------------
/**
* 启动Session操作
*
* @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
*/
function start($expireTime = 0){
$sessId = $_COOKIE[$this->cookieName];
if (!$sessId){
$this->sessId = $this->_getId();
$this->cookieExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
setcookie($this->cookieName, $this->sessId, $this->cookieExpireTime, "/", '');
$this->_initMemcacheObj();
$_SESSION = array();
$this->_saveSession();
} else {
$this->sessId = $sessId;
$_SESSION = $this->_getSession($sessId);
}
}
/**
* 判断某个Session变量是否注册
*
* @param string $varName -
* @return bool 存在返回true, 不存在返回false
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return true;
}
/**
* 注册一个Session变量
*
* @param string $varName - 需要注册成Session的变量名
* @param mixed $varValue - 注册成Session变量的值
* @return bool - 该变量名已经存在返回false, 注册成功返回true
*/
function register($varName, $varValue){
if (isset($_SESSION[$varName])){
return false;
}
$_SESSION[$varName] = $varValue;
$this->_saveSession();
return true;
}
/**
* 销毁一个已注册的Session变量
*
* @param string $varName - 需要销毁的Session变量名
* @return bool 销毁成功返回true
*/
function unregister($varName){
unset($_SESSION[$varName]);
$this->_saveSession();
return true;
}
/**
* 销毁所有已经注册的Session变量
*
* @return 销毁成功返回true
*/
function destroy(){
$_SESSION = array();
$this->_saveSession();
return true;
}
/**
* 获取一个已注册的Session变量值
*
* @param string $varName - Session变量的名称
* @return mixed - 不存在的变量返回false, 存在变量返回变量值
*/
function get($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return $_SESSION[$varName];
}
/**
* 获取所有Session变量
*
* @return array - 返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION;
}
/**
* 获取当前的Session ID
*
* @return string 获取的SessionID
*/
function getSid(){
return $this->sessId;
}
/**
* 获取Memcache的配置信息
*
* @return array Memcache配置数组信息
*/
function getMemConfig(){
return $this->memConfig;
}
/**
* 设置Memcache的配置信息
*
* @param string $host - Memcache服务器的IP
* @param int $port - Memcache服务器的端口
*/
function setMemConfig($host, $port){
$this->memConfig = array('host'=>$host, 'port'=>$port);
}
//-------------------------
// 内部接口
//-------------------------
/**
* 生成一个Session ID
*
* @return string 返回一个32位的Session ID
*/
function _getId(){
return md5(uniqid(microtime()));
}
/**
* 获取一个保存在Memcache的Session Key
*
* @param string $sessId - 是否指定Session ID
* @return string 获取到的Session Key
*/
function _getSessKey($sessId = ''){
$sessKey = ($sessId == '') ? $this->sessKeyPrefix.$this->sessId : $this->sessKeyPrefix.$sessId;
return $sessKey;
}
/**
* 检查保存Session数据的路径是否存在
*
* @return bool 成功返回true
*/
function _initMemcacheObj(){
if (!class_exists('Memcache') || !function_exists('memcache_connect')){
$this->_showMessage('Failed: Memcache extension not install, please from http://pecl.php.net download and install');
}
if ($this->memObject && is_object($this->memObject)){
return true;
}
$mem = new Memcache;
if (!@$mem->connect($this->memConfig['host'], $this->memConfig['port'])){
$this->_showMessage('Failed: Connect memcache host '. $this->memConfig['host'] .':'. $this->memConfig['port'] .' failed');
}
$this->memObject = $mem;
return true;
}
/**
* 获取Session文件中的数据
*
* @param string $sessId - 需要获取Session数据的SessionId
* @return unknown
*/
function _getSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
$sessData = $this->memObject->get($sessKey);
if (!is_array($sessData) || empty($sessData)){
$this->_showMessage('Failed: Session ID '. $sessKey .' session data not exists');
}
return $sessData;
}
/**
* 把当前的Session数据保存到Memcache
*
* @param string $sessId - Session ID
* @return 成功返回true
*/
function _saveSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
if (empty($_SESSION)){
$ret = @$this->memObject->set($sessKey, $_SESSION, false, $this->sessExpireTime);
}else{
$ret = @$this->memObject->replace($sessKey, $_SESSION, false, $this->sessExpireTime);
}
if (!$ret){
$this->_showMessage('Failed: Save sessiont data failed, please check memcache server');
}
return true;
}
/**
* 显示提示信息
*
* @param string $strMessage - 需要显示的信息内容
* @param bool $isFailed - 是否是失败信息, 缺省是true
*/
function _showMessage($strMessage, $isFailed = true){
if ($isFailed){
exit($strMessage);
}
echo $strMessage;
}
}
?>






