月份: 2014-10

政治的权威

《水浒传》里面的林冲,八十万禁军教头,响当当一条好汉。雪夜上梁山的时候,看见白衣秀士王伦不顺眼,一枪就将其挑死,但是面对高俅和高衙内的侮辱和陷害,一再退让,一再忍让,直到退无可退,忍无可忍。林冲的戏好就好在一个逼字。在水寨的日子里,林冲一直想杀掉高俅,每天将刀悬在卧室,等待着高俅的到来,但是高俅迟迟没有来,林冲之后再无杀高俅的机会,直到气死。但我想,假如高俅站到林冲的面前,林冲未必敢杀高俅。

最近在面试吕梁学院的教师岗位。初试的时候就是说一道五分钟的答辩题,但是我自我感觉紧张了。面对面试我从来没有像现在一样紧张过,一到了这些“公家”单位的面前,我就会不由自主的紧张,他们总是给我黑压压的感觉,像林黛玉进贾府。我想,这就是政治的权威。

林冲和我的境遇其实相差不多。就像刚毕业的时候我去应聘工行一样。当真正面对那种架势的时候,虽然实在的东西不多,但是外在的架子总会让你产生一种很害怕,很遥远的感觉。

人的心理是一种很奇怪的东西。处在特定的情况下,总会出现特定的反映,就像昨天面试一样,你一进入角色就会感到紧张。

这一刻我

想起了五丈原的诸葛亮

想起了麦城的关云长

想起了落凤坡的庞统

想起了白帝城的刘备

更想起了兵败的项羽

听着四面的楚歌

面前是刘邦的大军

背后是滔滔的乌江

浊浪翻天

如是我

也定不过江东

项羽要是过了江东

即使没有败给刘邦

也败给了历史

 

英雄常叹息

儿女常多情

 

 

火车上的意淫

现在我正在开往太原的火车上,旁边坐着的应该是很多民工叔叔大爷,还有两个女孩,和我年岁相仿。我听着轻音乐,看着他们的嘴一张一合,听不到他们在说什么,几个民工用装满行李的蛇皮麻袋围出了一个小天地,霸占了厕所的通道,他们喝着廉价的啤酒,吃着廉价的花生,正在兴致勃勃的打扑克,完全不顾厕所飘出来的臭味,脸上挂着的是褐色的笑容。两个小女孩和我一样手里拿着手机,用一根耳机线和手机进行着沟通,偶尔会笑一下,估计是看电视剧。我坐在7号位置上吗字。隆隆的火车声是一切的背景音乐,任凭你的音乐在高,你任然听见火车呼啸的声音,像是源源不断的从屁股底下喷射出来。这是一趟短暂的旅行。
我想我是这节车厢里面最苦的,即使我知道不是,但我要这样想,因为,我太自恋。我为了转移注意力,在上车之前给手机里装了几级许三多。但是,我还没有看。目前我的情绪没有任何异常,但是那久违的症状像是大海中摇曳的扁舟,随时就会覆没,这感觉也好不到哪里去,所以我想通过写字转移注意力。显然是失败的,我的注意力任然在心脏上,胸腔里。
我上来以后还没有回头看我的母亲,她就坐在我的身后,我知道她静静地坐着,可能还会和乘客聊天,但是,她心里肯定也在担心我,要不然她就不会来了。每一个子女的苦难也是每一个母亲的苦难。但我不能说,母亲也不会说,只有苦难来临的时候,母亲会默默坐在我的前面照顾我。
检票的时候我就把耳机塞到了耳朵里面,听着歌,看着人,人们都比较轻松,有两个男人看着天花板,聊着候车厅顶上鸟儿留下的残窝。
在车厅等车的时候,大家拥挤在一个狭窄的通道里,前面拦着一条很脏的栏杆。我们等待着工作人员开闸放水,间隙里,我看见旁边有一个美丽的女子,黑衣黑裤黑头发,正在低头玩手机,头发批下来挡住了她的脸颊。突然人潮涌动,冲乱了我们。尝尝的火车从我们头顶呼啸而过,气嘴里憋出了一声长长的轰鸣。
旅行是劳累的,就像人生。也许旅行只是为了去看一处景,去吃一道名吃,去照一张靓照。也许,这长长的旅途也是旅行的一部分吧。人们因为太过陌生便无任何拘束,也因为太过陌生而无话不谈,这是你找到心灵伴侣的最好途径,也是全新展现自己的最好机会。
我对去哪里一般都没有太多兴趣,而对去的一路兴奋不已。就像去西藏,如果不是一步步骑去的,那去有什么意义呢?旅行其实和朝拜一样,去往心灵干净的地方必然是坎坷劳累的,而只有那里才能洗涤你的疲惫。

放肆的旅行,不顾一切的玩耍。我想这样的旅行才过瘾。有的人出去是为了寻找安静,有的人出去是为了寻找刺激,有的人出去是为了找回自己,有的人出去是为了忘掉自己。其实没有什么不同。

我想起自己在成都的时候发生的事情,才发现自己太过年轻,而年轻要放肆,放肆就要付出代价,代价让人学会成长,成长便是人生的结果。

人生或许没有弯路,也没有捷径。你走的路都是必经之路。弯路是一种抱怨,而捷径是一种投机。人们总在失败后恍然大悟,而在跌倒时麻木不仁,吃一堑,长一智的是圣人,不被同一颗石头绊倒两次的人是因为根本就没有爬起来。数学有定理甚至真理。人生只有见机行事,我想这是最好的生活态度。不悲不喜,不急不躁,所谓壁立千仞,无欲则刚,所谓水不争而利万物说的都是人生态度。

我不懂佛,也不会讲佛,但我想慈悲就是水一样的心态。他自强来他自横。

很多的人生哲学都是放在七情六欲,喜怒哀乐上的,所以我们都懂但都做不到。就像坐在凳子上抬自己一样。

人要出世,不在于你经历了多少,而在于你悟到了多少,忘掉了多少。悟到的越多越高明,忘掉的越多越慈悲。

 

村上春树推荐阅读的100本书

“我喜欢阅读、听音乐、我还爱猫。即使我还是个小孩子,我也很高兴,因为我知道自已的所爱。直到现在我都没变过,这三样东西就是我的所爱,我的信心。”

——村上春树

 

弗朗茨•卡夫卡曾在1904年,致友人的一封信中说:“ 我想,我们应该只读那些咬伤我们、刺痛我们的书。所谓书,必须是砍向我们内心冰封的大海的斧头。”

——村上春树

 

……菲茨杰拉德的《了不起的盖茨比》、陀思妥耶夫斯基的《卡拉马佐夫兄弟》和雷蒙德·钱德勒的《漫长的告别》。它们都是我人生(身为读书人、身为作家的人生)中不可或缺的小说。倘若只让我从中挑选一本,那我会毫不犹豫地选择《了不起的盖茨比》。——村上春树

菲茨杰拉德作品

1、《了不起的盖茨比》

2、《夜色温柔》

3、《爵士时代的故事》

4、《失却的三小时》

5、《再访巴比伦》

 

雷蒙德·钱德勒作品

6、《漫长的告别》

7、《再见,吾爱》

8、《高窗》

9、《湖底女人》

 

陀斯妥耶夫斯基作品

10、《罪与罚》

11、《白痴》

12、《被侮辱的与被损害的》

13、《卡拉马佐夫兄弟》

 

迄今为止,我阅读石黑的作品时从来不曾失望过,也从未感到不以为然。——村上春树

石黑一雄作品

14、《无可慰藉》

15、《小夜曲——音乐与黄昏五故事集》

16、《上海孤儿》

17、《远山淡影》

18、《长日留痕》(英国布克奖获奖作品)

19、《浮世画家》(本书曾获“惠特布莱德文学奖”,是石黑一雄早期的一部名作。)

 

能见识保罗·奥斯特是我此生的荣幸。——村上春树

保罗·奥斯特作品

20、《孤独及其所创造的》(保罗·奥斯特动人自传)

21、《纽约三部曲》

22、《在地图结束的地方》

 

作为一个译者,非常幸运还能享有这样的喜悦:发现在日本还鲜为人知的作家。——村上春树

杰夫·戴尔作品

23、《杰夫在威尼斯,死亡在瓦拉纳西》

24、《懒人瑜伽》

25、《然而,很美:爵士乐之书》

 

我将金与其他众多恐怖小说家区别开来看待,是从第二部作品《撒冷镇》开始的。——村上春树

斯蒂芬·金作品

26、《撒冷镇》

27、《肖申克的救赎》

 

“优秀的经典名著多几种译本也不妨事,这就是我的基本看法……有几种高品质的选项,通过多种面貌的累积,原文应有的姿态自然而然地浮现出来,这才是翻译最理想的形态。我想《麦田里的守望者》已经跻身这类‘经典’的范畴。”——村上春树

塞林格作品

28、《麦田里的守望者》

29、《弗兰妮与祖伊》

30、《木匠们,把屋梁升高》

31、《西摩:一个介绍》

 

雷蒙德•卡佛终其一生,拼命坚持写作雷蒙德•卡佛的故事。由于他稍微拯救了自己,我们也会(在大多数情况下)稍微获得拯救。这大约就是卡佛作品为全世界读者热心阅读至今的理由之一。——村上春树

雷蒙德•卡佛作品

32、《当我们谈论爱情时我们在谈论什么》

33、《请你安静些,好吗? 》

34、《我打电话的地方》

35、《大教堂》

36、《我们所有人:雷蒙德卡佛诗全集》(全二册)

37、《需要时,就给我电话》

38、《我父亲的生活》

39、《水交汇的地方》

40、《给苔丝》

41、《如果它令你满足》

42、《野鸡》

43、《愤怒的季节》

 

……卡夫卡是我一生最钟爱的作家之一。我15岁时第一次接触卡夫卡的作品《城堡》,这是一部了不起的经典巨作,带给我极大的触动,卡夫卡在书中描绘的世界既真实又虚幻,将我的心灵和灵魂同时割裂成两部分。——村上春树

卡夫卡作品

44、《变形记》

45、《城堡》

46、《审判》

47、《失踪者》

48、《饥饿艺术家》

49、《乡村医生》

 

我喜欢传记,图书馆里能找得到的都要看看。比如有关苏维埃革命的书,还读了不少关于纳粹的书,东京创元社出版了威廉·夏伊勒的《第三帝国的兴亡》,我对这本书入了迷,还有他的《柏林日记》。筑摩书房的《当代世界纪实文学全集》也让我相当着迷。还有埃德加·斯诺的《红星照耀中国》等。——村上春树

50、《第三帝国的兴亡》

51、《柏林日记》

52、《红星照耀中国》

 

他(契诃夫)不太陈述意见。只是认真观察细微之处,加以描写。观察后描写,再观察,再描写。从这种姿态中,他的愤怒和悲痛静静地浮现了出来。不是愤怒或悲痛地在写,而只是凸显结果。契诃夫作为一名观察者,真是非常出色啊。——村上春树

契诃夫作品

53、《萨哈林旅行记》

54、《套中人》

55、《变色龙》

56、《黑衣教士》

57、《第六病室》

 

《拧发条鸟与星期二的女郎们》这个短篇原来打算描写像夏目漱石的《门》那种情形。小巷深处一栋静悄悄的房屋,生活着一对年轻夫妇。故事就从那里开始。——村上春树

夏目漱石作品

58、《门》

59、《心》

60、《我是猫》

61、《哥儿》

62、《细雪》

 

“在那之前的年代,有过战争、有过贫穷,值得写的东西比比皆是。从思想性的角度,出了《蟹工船》那样的作品。但我根本没有想写的、值得写的东西。大学毕业后开店,欠了债,每天忙忙碌碌地工作。直到二十九岁地某一天,忽然觉得‘啊,好像能写啦’。没有任何根据,只是这么想而已。”——村上春树

小林多喜二作品

63、《蟹工船》

 

“弗雷泽是以前看的,其实记得不怎么清楚,经常看的倒是《我们赖以为生的神话》的作者约瑟夫・坎贝尔的作品。并不是对写小说有什么帮助,仅仅是因为有趣才读的。说到有趣的事,对我来说,是能将书中所写的东西据为己有,用英语来说便是tangible(伸手可及)的材料。”——村上春树

约瑟夫・坎贝尔作品

64、《我们赖以为生的神话》

 

艾丽丝·门罗作品集

65、《公开的秘密》(诺贝尔文学奖得主门罗作品,首部荣耀国际文坛的代表作,收录村上春树翻译成日语版的《蓝花楹旅馆》)

 

“我希望书的封面尽可能不要使用电影画面,因为那样难免会限制读者的想像力。‘郝莉•戈莱特利这个女人,到底是什么样子呢?’——跟随故事的进展,每一位读者都自由自在地驰骋想像力,才是阅读此类小说的一大乐趣。”——村上春树

杜鲁门•卡波特作品

66、《蒂凡妮的早餐》

67、《冷血》

68、《我想起了爷爷》

69、《圣诞纪事》

70、《无头之鹰》

 

“因为知道了布劳提根和冯内古特,心想还有这样的小说啊,我觉得这极大地影响了比如《且听风吟》和《一九七三的弹子球》)。假如没有他们,我想或许就不会有那样的作品了。”——村上春树

布劳提根作品

71、《在美国钓鳟鱼》

72、《避孕药与春山矿难》

 

冯内古特作品

73、《众生安眠》(黑色幽默文学大师冯内古特遗作首次出版 )

74、《看这儿,照相啦!》

75、《回首大决战——及关于战争与和平的其他新作》

76、《冠军早餐/囚鸟》

77、《五号屠场》

 

“这段时间我又重读了一遍《毛姆全集》。”——村上春树

毛姆作品

78、《月亮和六便士》

79、《面纱》

80、《刀锋》

81、《人性的枷锁》

 

“在结构上,鲁迅的《阿Q正传》通过精确描写和作者本人截然不同的阿Q这一人物形象,使得鲁迅本身的痛苦和悲哀浮现出来。这种双重性赋予作品以深刻的底蕴。”——村上春树

鲁迅作品

82、《阿Q正传》

 

在日本,我前面一代的三个重要作家,是三岛、安部公房和大江健三郎。他们当中,我必须说,我最喜欢安部,最不喜欢三岛。我几乎没读过三岛,因此我想我与三岛间没有什么相似点。——村上春树

安部公房作品

83、《墙——卡尔玛氏的犯罪》

84、《赤茧》

85、《砂女》

 

(《奇鸟行状录》)设定为1984年,当然是因为乔治·奥威尔的《1984》。——村上春树

乔治·奥威尔作品

86、《1984》

87、《动物庄园》

 

我读的第一本长篇小说是《静静的顿河》……上中学的时候我读了三遍,因为太有趣了。——村上春树

88、《静静的顿河》

 

我非常喜欢物语、故事 之类。儒勒凡尔纳的《地心游记》、《海底两万里》,福尔摩斯,亚森罗宾等这一类故事。还有大仲马的《三剑客》、《基督山伯爵》和《悲惨世界》之类的,非常非常有趣的故事。——村上春树

89、《地心游记》

90、《海底两万里》

91、《三剑客》

92、《基督山伯爵》

93、《悲惨世界》

94、《福尔摩斯探案集》

 

其它作品

95、贝尔·克鲁 《爵士乐逸事》、《从波德兰到百老汇》

96、格雷斯·佩利《最后瞬间的剧变》

97、马克·斯特兰德《巴比夫妇》

98、米歇尔·吉曼 《利穿心脏》

99、约翰·欧文《放熊归山》

100、蒂姆·奥布莱恩《核时代》
转载自:http://www.cunshang.net/index.php/2014/10/15/5631.html

孤独的跑道

 

我非常喜欢跑步,尤其是在得病了以后。

但是好像我永远也跑不了多少,我的父亲说我是没有磨练出来,我想长这么大了,受到的挫折这么少,他说的还是有一定道理的。

人需要有一个自身来说较好的资质,这里的资质,包括你的体质,你的智商,你的情商等等。等到自己的资质到了一定水平的时候,我们需要出去磨练,慢慢的加大磨练的程度,慢慢的你的耐受能力就起来了。

就像徒步,如何到达理想的徒步。首先要有一个很好的体质和良好的心理素质。需要进行能量和体力的储备。当自己觉得自己的身体条件可以的时候,就可以试着徒步,但是切记量力而行,不要太过理想化。这是我吃的亏。需要循序渐进,今天走15公里,每天坚持走15公里,等到完全可以很轻松的走完时,慢慢加大,直到有一天,你觉得自己可以了,就去西藏吧。

不论学习,生活,我想都是这样,需要稳重,需要储备,还需要冲刺,需要爆发。厚积要厚发。

我现在有点喜欢离石这座小城了,生活节奏缓慢,每天楼下的早市上叫卖,谈笑,好不热闹,对面的生态公园里每天放着放不完的秧歌曲调,老头老太太们随着曲调翩翩起舞,眉来眼去。小学上学的时候,整条街都堵得死死的,门口停着密密麻麻的电动自行车,小学生们快乐的上学。远处凤山上阳光普照,一颗巨大的球状水塔泛着金光。

以前我觉得老百姓,小井市民聊天都特别没意思,每天说着七大姑,八大姨的事情,谁家的小子结婚了,谁家的狗咬了谁家的猫,还有老头自己坐在公园里下棋,叫喊,觉得特别没意思。现在,觉得那才是生活的气息,什么叫有意义的生活,不是做有意义的是,而是活的愚昧一点,活的笨一点。

离石有一条河叫北川河,河面宽阔,上面站着很多桥,两岸栽着很多树,沿河有一条长长的人行道,我每天都去这里散步,跑步。我对自己生活环境的人文环境没有什么要求,因为我觉得自己有时候和一些大妈还能聊的忘乎所以,但是我需要一个很好的自然环境,我对自己的生活环境就这么多的需求,我喜欢照太阳,在阳光明媚的早晨跑步,呼吸,至于能不能当作家,无所谓。

我发现不论是年轻人还是中年人,老年人,都没有几个特别爱跑步。大家要不做操,要不散步,只有我想一个傻B一样,跑过来,跑过去。今天是我自回家跑的路程最长的一次,跑完身体还没有出现异常。我一直跑到了第三座桥下,大堆的废墟挡住了我的去路,那废墟一直延伸到河了,河水也不得不改道。

跑步是特别孤独的一件事,所以,爱思考的人跑步才不至于枯燥。

此外,跑步前一定做好热身,尤其是天气冷的时候,容易抽筋。

php输出控制

1、简介

当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header()或setcookie()发送的文件头信息,仅影响像echo这样的函数和PHP代码块间的数据。

 

2、作用

1)、如官方介绍说,为了避免在输出文件头信息如header()和setcookie()之前出现输出而发生的错误。可以使用输出缓存函数。如下代码

1
2
3
4
5
<?php 
    ob_start();      //打开缓存控制函数
    echo 'hello';
    header('Location: http://www.example.com/');
?>

2)、将输出内容放入缓存区,如需进行其他操作,如将输出写入缓存文件,可将缓冲区内容写入缓存文件,然后输出。

1
2
3
4
5
    ob_start();
    echo 'hello';
    $file = ob_get_contents();
    ob_end_clean();
    write_cache($file);    //将缓冲区内容写入缓存函数,实现细节省略

3)、获取某些无返回值内置函数的输出内容,如phpinnfo();

1
2
3
4
5
6
7
<?php
ob_start();
phpinfo();
$file = ob_get_contents();   //phpinfo()输出内容
ob_end_clean();
 
?>

4)、在使用框架的时候,我们会发现框架中会将输出缓冲然后进行变量替换。最后输出。

除了这些内容,我们还可以利用输出缓存进行错误处理,具体看代码。我们可以将错误信息获取,以更加友好的方式输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
function display_error()
{
	if($errors = error_get_last())
	{
		return var_export($errors , TRUE);
	}
	return FALSE;
}
 
$dis_error = 'display_error';
 
//$a = 3;
 
ob_start( $dis_error );
 
echo $a;

附:ob_start()官方解释:

1
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

output_callback
可选参数 output_callback 函数可以被指定。 此函数把一个字符串当作参数并返回一个字符串。 当输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 output_callback 时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果这个 output_callback 不是一个可以调用的函数,此函数 会返回 FALSE 。

如果回调函数有两个参数,第二个参数会由一个位域补充,该位域由 PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT 和 PHP_OUTPUT_HANDLER_END 组成。

如果 output_callback 返回 FALSE ,其原来的输入 内容被直接送到浏览器。

这个参数 output_callback 可以通过直接给一个 NULL 值而避开。

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() and ob_start() 不能从一个回调函数中调用。 如果从回调函数中调用了它们,产生的行为是不明确的。 如果想要删除缓冲区的内容,从回调函数中返回一个”" (空字符串)。 更不能从一个回调函数中使用像print_r($expression, true) 或highlight_file($filename, true) 一样的输出缓冲函数。

寂静之声

是河流

是山野

有鸟叫

有花香

河流潺潺

漫山的绿草丛中蝴蝶悄悄的嬉戏

 

我将你送到这里

你将独自踏上归路

有我的陪伴

眼前是美好的

未来也是美好的

背上行囊快走吧!

去寻找自由

去寻找理想

 

这不是离别

你我却泪眼阑珊

我会在这里静静的等待你的归来

重逢的我们没有大哭

不会相拥

就像现在一样

在阳光的照耀下

微笑的带着眼泪

一切都化在了这山这水里

 

你走的时候

蝴蝶飞累了

站在一棵青绿的小草上

整理着自己的触须

 

 

 

 

 

冬天来了

冬天来了

我蜷缩起被角

整个秋天像是一个世外的故事

把我封在一切繁华的角落

我渴望着解脱

我向往着现实

 

冬天是白色的

寂静的

却让人不安,聒噪

我想冬眠的蛇也在烦躁

我想被冻伤的柳树也在暗暗抽芽

 

冬天过去吧

让河水融化

让春柳发芽

让蟒蛇出洞

让大地焕发

一年就是一个轮回

而轮回的终点大雪飘零

 

一切都是因为冬天

一切也将随着冬天结束

结束吧!

我像一个虔诚的教徒

或跪或卧

我默念着,我祈祷着

等待着开春的第一旅阳光

等待着柳树的第一次拔芽

 

结束吧!

让我们一起把过去封印在过去

把痛苦冻死在河底

我愿做一只冰层下静静等待的草鱼

等待着

等待着

 

 

聪明的人和糊涂的人

能不能聪明说的是智商,而能不能糊涂就是说的一个人的情商。

郑板桥说难得糊涂,不是真正的糊涂,而是心里是明镜,却装不懂。说的是处世做人的态度。

sae 应用仓库指南

转载:http://blog.sina.com.cn/s/blog_73b89cd30101230u.html
一,为什么要移植应用
 
 
 
    SAE禁止IO写操作,代码目录不能写入。这意味着普通程序的上传图片、生成缓存等操作都不能在SAE上正常运行,这时候你需要对这些代码进行修改后才能让你的程序运行在SAE上。
 
 
 
SAE为什么要禁止IO写操作?
 
 
 
    SAE采用分布式架构设计, 应用代码将部署在多台前端服务器上, 每次访问请求可能到达不同服务器。(如下图):
 
 
    假设现在有A、B、C、D四台服务器。用户上传一张图片到A服务器,第二次访问请求可能到达B服务器,此时将无法获取保存在A服务器上的图片。
 
 
 
    SAE使用MemcacheX、Storage等存储型服务代替传统IO操作,效率比传统IO读写操作高,有效解决因IO瓶颈导致程序性能低下的问题。
 
 
 
    另外,很多网站被攻击都是因为服务器有写的权限,程序代码能被黑客修改,SAE禁止写操作,也提升了服务器的安全性。
 
    所以SAE为了提升性能和安全,禁止本地IO写操作。开发者可以使用StorageMemcacheKVDB等服务存储需写入的数据。
 
 
二,快速移植你的程序
 
 
使用Wrappers
 
    SAE虽然禁止了IO写操作,但是并没有禁止fwrite,file_put_contents等写操作函数,同时SAE还提供了Wrappers服务,这使得移植程序也比较简单。 假设我们要将下面的代码移植到SAE上。
 
  file_put_contents(‘test.php’,”); 
  include ‘test.php’;
?>
    只需要给文件地址加上前缀就可以了
 
  file_put_contents(‘saemc://test.php’,”); 
  include ‘saemc://test.php’;
?>
 
    如果地址的前缀为saemc://  表示在Memcache中进行读写操作 ,如果前缀为saestor:// 表示在Storage中进行读写操作。前缀为saekv://就是对KVDB的操作。这就是Wrappers的功能。
 
注意:
 
    1,在使用Wappers前,需要先初始化相应的服务。
 
    初始化Memcache:进入Memcache服务管理后台 http://sae.sina.com.cn/?m=mcmng ,然后在网页右上角“我的应用中”选择指定应用。点击“点此初始化MC”的按钮就可初始化Memcache
 
    初始化Storage:进入Storage服务管理后台http://sae.sina.com.cn/?m=storage ,选择指定应用后 ,“点击创建一个domain”按钮进行创建。这里允许创建多个domain, 开发者使用Wrappers将文件上传到哪个domain,取决于文件地址的第一个目录名称。 如 “saestor://upload/image/1.jpg” 这样的地址,会将文件保存在名为upload的domain中。
 
    另外MysqlKVDB也是需要先初始化才能使用,如果程序有用到这些服务,请先初始化。
 
    2,操作频繁的缓存不适合存储在Storage中。
 
    Storage读写效率比KVDBMemcache低很多。操作频繁的缓存不适合存储在storage中,所以除操作用户上传的文件外,尽量不要使用saestor://。
 
    尤其是一些程序代码片段的缓存。如上面的例子,如果使用如 include ‘saestor://xxx’ 的代码来实现会使得程序性能较低。
    
    理解了Wrappers的用法后, 就可以开始移植程序了。
 
利用报错快速定位
 
    开发者可以利用SAE的错误提示,快速的定位到程序需要修改的代码。
 
    首先保证你的应用开启了错误提示。进入应用的“代码管理”后台http://sae.sina.com.cn/?m=vermng, 看看对应版本的“错误提示”是否开启(默认是开启的)。 还有检查一下程序有没有类似error_reporting(0)的代码,屏蔽了错误提示。如果有,请先将他们注释掉。
 
    然后将程序上传到SAE。如果有不兼容的地方,错误提示会告诉你具体文件的具体行。
 
    如果出现类似这样的提示:
 
SAE_Warning: file_put_contents(./xxx.php) [function.file-put-contents]: failed to open stream: Permission denied in xxx.php on line 2
 
    说明程序正在进行IO写操作, 只需给地址加上Wrappers的前缀,就能实现兼容。 
 
    如果你的程序的封装性好,更改IO写操作的代码, 往往很简单。比如ThinkPHP定义了RUNTIME_PATH常量。所有IO写操作产生的文件都会存放在 RUNTIME_PATH常量指定的文件夹中, 移植ThinkPHP程序, 只需要更改RUNTIME_PATH常量,加上saemc:// 前缀就可以了。其实其他框架或封装性比较好的程序,也是如此,只需更改一行代码,就能兼容IO写操作。如果你是重新用ThinkPHP开发程序的话,建议 使用SAE版ThinkPHP。
   
    注:使用Wrappers后,有些操作是无效的。 比如file_exists ,大家可以直接将这样的函数注释掉。
 
 
    如果出现类似下面的提示:
 
SAE_Warning: mysql_connect() [function.mysql-connect]: this app is not authorised in xxx.php on line 2
 
    说明程序正在使用Mysql数据库,这时候需要初始化Mysql,并导入数据库。你可以在初始化后点击“管理Mysql”按钮,使用PHPMyAdmin进行数据导入。 当你数据比较大时,可以用DeferredJob服务来导入。
 
    导入数据库后,还要将原程序中数据库用户名、密码等更改为SAE的。 SAE的数据库用户名、密码、数据库名使用常量表示。可以在mysql服务管理处看到。SAE的Mysql数据库支持分布式,能连接两个数据库。如果你的原程序只支持单数据库操作,请连接主库域名。
 
     当你的程序在SAE上没有出现错误提示了,你的程序已经初步能在SAE上面运行了。你还要检查一下一些细节的功能是否实现。比如上传图片功能等。建议将上传的图片或其他附件存放在Storage中。图片存储在Storage中后, 图片的访问地址也和以前不一样。你需要使用Storage的getUrl方法获得图片访问地址,如:
   
$s=new SaeStorage();
$url=$s->getUrl(‘domain’,'filepath’);//获得图片地址,filepath为图片在storage中的路径
?>
 
     接下来,开发者可以对程序进行进一步的优化,让程序达到更好的性能。
 
三,性能优化
 
    我们提供了一些优化的建议。
   
IO操作产生的文件进行区分存储
 
      (1)建议将模板编译缓存或其他程序代码片段的缓存放在Memcache中,坚决反对将模板编译缓存放在Storage中, 因为Storage的读写效率比Memcache低,将它们存入Storage会导致你程序运行较慢。
 
      (2)将上传的图片或附件存储在Storage中。如果你的图片需要防盗链等功能, 你还可以在SAE的服务管理后台,通过设置domain的属性能轻松的实现防盗链。
 
      (3)将一些固定缓存存入KVDB中。有一些缓存不适合存储在Memcache中, 因为Memcache中的缓存有可能会消失,比如Memcache空间不足时,最早存入Memcache中的缓存就会被删除。所以你存入到Memcache的缓存,在读取时必须需要判断缓存是否存在,如果不存在重新生成。但有一些缓存生成一次后一般都不会变了,在读取缓存的时候不用判断它是否存在。 这类缓存建议使用KVDB进行存储。
 
 实现数据库的读写分离
 
    SAE MySQL数据库主库可读写,从库只读。查询使用从库消耗的云豆更少,且响应更快,所以建议大家尽量实现主从分离。现在很多框架,程序都支持读写分离,只需简单配置即可。如果程序只支持单数据库 可以尝试在执行SQL时进行判断如果是Select则连从库。
 
多使用SAE提供的服务
 
    SAE提供了很多高效的服务,建议程序能使用SAE服务的地方尽量使用SAE服务。比如程序有排行榜的功能, 可以使用Rank服务实现;验证码的功能, 可以使用SaeVCode服务;发送邮件的功能, 可以使用Mail服务等等。请大家查看各个服务相关的文档进行学习。
 
考虑使用原生接口
 
    Wrappers固然方便简单, 但它的效率肯定不如原生的MemcacheStorage接口。如果你很在乎效率问题, 可以考虑使用原始接口实现移植。 使用原生接口实现移植的方法可参考:http://qing.weibo.com/1631767865/6142cd3933000cj9.html
 
四,常见问题
 
实现伪静态
 
    SAE不支持.htaccess文件,但是可以通过AppConfig服务实现伪静态。
 
生成静态页面
 
    有些程序有生成纯静态html的机制。大家可以使用KVDB存储html静态页面数据,由于SAE禁止IO写操作,不能实现真正的纯静态,我们可以用伪静态的方式到达同样的效果,下面举一个简单的例子。
    假设程序在未移植之前通过以下代码生成html文件:
 
file_put_contents(‘html/index.html’, ‘htmlcontent’);
?>
 
    这样用户通过浏览器输入地址 http://你的域名/html/index.html  访问到的是一个纯静态页面。
    现在我们要将程序移植到SAE上。
    首先将html数据保存到KVDB上。
 
file_put_contents(‘saekv://html/index.html’, ‘htmlcontent’);
?>
 
    使用config.yaml, 写一条伪静态语句
 
- rewrite: if (path ~ “/html/(.*)”) goto “/readhtml.php?path=html/$1″
 
    如果用户访问了html目录会伪静态到readhtml.php文件进行读取静态数据。
    readhtml.php的代码为:
 
echo file_get_contents(‘saekv://’.$_GET['path']);
?>
 
     这样,在SAE上用户也能通过浏览器输入地址 http://你的域名/html/index.html 访问到数据。
 
日志记录。
有些程序有日志记录功能, 如果日志读写太频繁,不适合将日志文件存入storage中,建议使用sae_debug实现日志记录。 但是sae_debug记录日志的同时也会向浏览器输出日志内容。很多程序希望能现实暗地记录日志, 大家可以通过封装函数实现。
如:
function sae_log($msg){
    sae_set_display_errors(false);//关闭信息输出
    sae_debug($msg);//记录日志
sae_set_display_errors(true);//记录日志后再打开信息输出,否则会阻止正常的错误信息的显示
}
?>
 
通过sae_debug函数记录的日志可以在应用管理后台中的“日志中心”查看,它属于debug类型的日志, 大家需要在搜索框中下拉菜单中选择debug类型进行查看。
 
缓存共享问题
 
     SAE每一个应用能创建多个版本,但是这多个版本共用同一个MemcacheKVDB等 服务,有时候容易出现缓存共享问题。比如一个应用创建了两个版本,放有相同的程序, 程序有模版缓存机制,可能会出现,只修改了版本1的模板,却发现版本2的内容也被修改了。我们要避免不同版本之间缓存名称相同的现象。开发者可以使 用$_SERVER['HTTP_APPVERSION']变量给缓存名称加上应用的版本号
 
Memcache缓存需要有更新机制
 
    Memcache缓存因为有消失的可能, 所以在读取Memcache缓存时应该要判断缓存是否存在,如果不存在重新生成缓存,否则的Memcache缓存一旦被删除而程序又没有更新缓存的机制,将可能导致网站不能正常访问。开发者可以在程序移植完成后在应用的Memcahe服务管理后台手动清空Memcache缓存,再测试一下网站是否能正常运行。 建议将不需要更新机制的缓存使用KVDB存储。
 
6 如何获得Storage的域名
 
    有时候程序的图片访问路径可以定义前缀, 我们只需要将前缀替换为Storage的域名就可以了。 获得Storage域名的方法:
 
$s=new SaeStorage();
$domain=rtrim($s->getUrl(‘domain’,”),’/');//注意getUrl的第二个参数为空
?>
 
7 有些地方不能用Wrappers
    并不是所有文件地址前加上Wrappers相应的前缀都能实现兼容。 比如以下代码:
 
$img=imagecreatefrompng(“http://sae.sina.com.cn/static/image/logo.beta.new.png”);
//…经过了一些列的图片处理函数处理…
imagepng($img,’saestor://upload/logo.png’);//想通过Wrappers保存处理后的图片
?>
 
    上面的代码是不能将图片保存到storage中的。 
 
    开发者可以使用临时文件解决上面的问题。
 
$img=imagecreatefrompng(“http://sae.sina.com.cn/static/image/logo.beta.new.png”);
//…经过了一些列的图片处理函数处理…
imagepng($img,SAE_TMP_PATH.’logo.png’);//保存为临时文件
file_put_contents(‘saestor://upload/logo.png’,  file_get_contents(SAE_TMP_PATH.’logo.png’));
?>
 
    所以要注意,虽然大家把程序中文件地址加上了wrappers的前缀,也要检查一下 文件地址是否在用在了不支持Wrappers的函数上。
 
    一般的文件操作函数都是支持Wrappers的,如file_put_contents,fwrite,file_get_contents,include,file_exists, filemtime,move_uploaded_file等等。  只有个别带特殊功能的函数不支持Wrappers
 
8 SAE禁用了一些函数和类
 
    出于平台安全性考虑,SAE禁用了一些函数了类,详情查看
http://sae.sina.com.cn/?m=devcenter&catId=220 
 
    请使用功能相同的其他函数代替禁用的函数,如可用SimpleXML代替DoMDocument实现XML解析。
 
五,提交到应用仓库
 
    开发者可以将移植好的程序提交到SAE的应用仓库, 这样别人可以通过应用仓库一键安装就能快速获得你的程序。
 
    建议大家在移植程序的时候写一篇“移植记录”。提交应用时一并将移植记录提交给我们。这样方便我们审核你的应用。
 
    移植记录需要写清楚移植程序时哪些地方做了修改,使用了什么SAE服务等。
   
    提交到应用仓库的更多细节请见 http://sae.sina.com.cn/?m=devcenter&catId=230
    或直接访问以下地址:http://sae.sina.com.cn/?m=apps&a=step_sae_app

网站的前台和后台

今天早上想如何安排网站的前台和后台结构,也看了不少网站的结构。

很多网站一般都会将前台和后台分开开发,至少前台会取一个文件夹叫application,后台取一个文件夹叫admin。然后各自开发各自的。

但是,其实前台和后台是一个道理,不一样的只是一般后台会有在每次点击菜单的时候进行登录检测和权限认证。

今天的目标就是写一个公共后台类,进行登录操作,以及登录检测,使得每一次后台按钮触发都要进行登录检测。

使用的框架是CI。

SAE的storage服务

今天终于弄懂了sae的storage怎么使用。

这里是sae的storage的概述地址:

http://sae.sina.com.cn/doc/php/storage.html。

因为sae不支持文件权限设置,所有的代码文件都是不可数的。但是sae提供了特别好的一个分布式文件存储服务,用来存放持久文件。其实就是用来存放网站的素材文件,如图片,文件等等的。

所以,当需要存储文件数据的时候,可以使用使用sae。

 

使用sae一共有两种方案。

官方提供的一种方案是:

使用官方的storage类,直接可以进行文件操作,如存放文件,删除文件,修改文件等等。

官方API文档地址:http://apidoc.sinaapp.com/sae/SaeStorage.html

 

还有一种方法是我在sae的应用商店看到的,里面有一个合成的wordpress for sae。

我们可以看到详细的代码,我现在将自己简单的测试代码贴到下面:(只为实现storage,不适用于开发场景)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
<body>
 
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>
 
</body>
</html>
 
<?php
 
$domain = "test";
$upload_dir = "saestor://" . $domain . "/qiao1/2/3/4/5/";
 
if(!is_dir($upload_dir))
{
	//mkdir($upload_dir , 0777);
}
 
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
 
  }
if(move_uploaded_file($_FILES["file"]["tmp_name"],$upload_dir . $_FILES["file"]['name']))
{
	echo 'ok';
}
 
 
//mkdir($upload_dir . 'qiao' , 0777);
 
?>

我们可以直接使用move_uploaded_file函数将临时文件上传。要注意的是第二个参数$upload_dir=”saestor://” . $domain . “/” . $dir。

其中,$domain就是storage中创建的storage服务名称。$dir就是要存放的目录。

如要将文件存放在saestor://mydomain/dir1/dir2/dir3/下。可以直接使用该url,而不需要使用mkdir函数进行创建,因为stotage已经将该目录自动进行了创建。