从php核心代码看require和include的区别

前言 五一长假归来,休息长时间很有点不习惯,回到北京已经有些不适应了。
见到鸟哥的一文:深入理解PHP之require/include顺序 http://www.laruence.com/2010/05/04/1450.html 忍不住继续再深入了一下下,在此记录一下深入的过程,以供以后查阅。

普及 在php手册中:

require() is identical to include() except upon failure it will also produce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a warning (E_WARNING) which allows the script to continue.
就是说在失败的时候,require是会中止php运行的,而include是可以继续运行的。
倒底有什么样的区别呢?我们带着这个疑问来一起进入PHP的核心代码。
下面是一个PHP运行过程的图(这个图是出自哪里的?鸟哥画的?) php

补习一下:lex是代码扫描器,扫描代码用的,yacc是Yet Another Compiler Compiler,作用是把任何一种代码的语法转成yacc语法,yacc就是解析器(真TMD绕)。
lex在c下的后缀是*.l yacc是*.y

正题 下面看操作记录:

cc@cc-laptop:/opt/workspace$ svn checkout http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3
从svn取最新的php源代码。
开始深入:
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name "*.l" -exec grep -Hn "require_once" {} \;
./Zend/zend_language_scanner.l:1093:"require_once" {
寻找lex代码扫描器文件中出现require_once的地方,zend_language_scanner.l的1093行。
1093 "require_once" {
1094 return T_REQUIRE_ONCE;
1095 }

然后再搜一下T_REQUIRE_ONCE,

cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name "*.y" -exec grep -Hn "T_INCLUDE" {} \;
./Zend/zend_language_parser.y:52:%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
./Zend/zend_language_parser.y:985: | T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
./Zend/zend_language_parser.y:986: | T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }

在985行附近,有这样一群代码:

internal_functions_in_yacc:
T_ISSET '(' isset_variables ')' { $$ = $3; }
| T_EMPTY '(' variable ')' { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
| T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
| T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
| T_EVAL '(' expr ')' { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
| T_REQUIRE expr { zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
| T_REQUIRE_ONCE expr { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
;

于是乎,我们需要继续深入寻找zend_do_include_or_eval,

cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name "*.c" -exec grep -Hn "zend_do_include_or_eval" {} \;
./Zend/zend_compile.c:4317:void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) /* */

zend_do_include_or_eval中组装了一个结构体,ZEND_INCLUDE_OR_EVAL。

再在zend_vm_def.h中找到ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY):
switch (Z_LVAL(opline->op2.u.constant)) {代码略}

中间关键的一句是:
new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);

在zend_complie.h文件中:
ZEND_API zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC);

这个函数定义在zend_language_scaner.l文件中,找出最核心的代码:

if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) {
// require与include的差别:错误信息的显示级别(有bailout和无bailout)
if (type==ZEND_REQUIRE) { //require时
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
zend_bailout();
} else {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
} compilation_successful=0;
} else {代码略}

继续追踪zend_message_dispatcher可以在main/main.c文件中找到php_message_handler_for_zend函数:

//include输出错误信息时的级别为:E_WARNING
case ZMSG_FAILED_INCLUDE_FOPEN:
php_error_docref("function.include" TSRMLS_CC, E_WARNING, "Failed opening '%s' for inclusion (include_path='%s')", php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path)));
break;
//require输出错误信息时的级别为:E_COMPILE_ERROR
代码略

总结 和开头PHP手册所说完全一致,require和include的区别在于,出现错误时,一个是error一个是warning。

54chen Twitter Memo 2010-05-02

  • 今天在丰台讲课未能到场远送,祝一路平安!@Fenng: 恭贺QCon大会圆满闭幕!我不得不去机场了,再见各位!#QCon #
  • 现场的同志们,出酒店来看看,打雷了下雨了,快收衣服。。。@tinyfool: 这也是活得彪悍的一种形式,虽然是错的 RT @dreamwords: 现场有一个人的短信时不时响一声,静音坏了?或者觉得自己很酷?#QCon #
  • 简历中的802.1x客户端我深刻的想知道与我的提供下载的有什么异同 http://is.gd/bI3XD @162cm: RT @virushuo: @techzhou: 时髦一把 twitter上找工作 本人简历 http://tinyurl.com/2ffmcak #
  • QCon回忆录 http://ur.ly/ad5E #
  • 哈哈,使用twitter的Qconer不在少数。。。@wolfdeng: @54chen QCon回忆录 http://is.gd/bIdaD //我就是那一系列的同学之一 #
  • 侯冲:“她低头走进车厢,木质的地板发出呻吟……”“只有这时候她才能贪婪地看他。”“男孩给心仪的女孩写情书。然后一起在挣扎中甜蜜。”“第一次对白,他们之间没有过交谈,因为第一句对白是句号,第零句对白是省略号。欲言又止,相见情动…”(武汉国际作文竞赛中,小学六年级学生的作文句子) #
  • RT @d_yang: 其实, 2012大不了就是像在iMax里看一场电影, 区别是, 不需要排队买票. #
  • [RT]侯冲:一直偷邻居的无线网络用(他很少上网每天天也就一两个小时),今天他家的路由器死机 了,为了重启他家路由器,去走廊把他家电闸拉下来又合上了,真是太无耻了 #
  • 刚出现即被灭种的神兽:粉笔狐 Chinese ChalkVulpe 善人言,但因非人,故语速极缓,兼带官腔。粉笔狐只出没与灾区,却被视作祥瑞,认为会带来新的曙光。结伴活动。在河岸边向阳的山坡下掘穴居住,通常毗邻河蟹的洞穴。新校园,会有的! #
  • 兄弟要去香港过五一?@rewinx: 在北京市公安局出入境管理大厅,办完港澳通行证商务签证。 #
  • 那以后真方便出去玩了呀。。@rewinx: RT @54chen: 兄弟要去香港过五一?@rewinx: 在北京市公安局出入境管理大厅,办完港澳通行证商务签证。//金山股票港股开户,需要港澳通行证,公司组织去办的。 #
  • 地阳,我只在大连北京杭州呆过,再南的就没去过了@d_yang: @54chen 兄弟在深圳待过吧? 不会还没有良民证把? #
  • 修改了一个ssh-twitter的客户端,测试中 #
  • http://www.54chen.com/_linux_/ssh-twitter-client.html 发布一个简单的ssh-twitter客户端 #
  • http://www.54chen.com/_linux_/ssh-twitter-client.html 这工具献给有国外ssh主机的同志们方便使用 #
  • 应该没有问题吧,README什么的都保留原来的版权信息的 GPLv2没有说不准我放在别的地方托管吧@ahxxm: 問一下,這個本身有來源主頁,你這樣修改應該沒問題吧? RT @54chen: http://ur.ly/aE9g 这工具献给有国外ssh主机的同志们方便使用 #
  • 先运行一下 export LANG=zh_CN.UTF-8 再使用@ahxxm: @54chen 啊哦。。國外主機不支持中文字符。。。 #
  • 给权限先 czhttp@gmail.com RT@Fenng: QCon Beijing 参会推友调查(非官方), 请到会的推友协助一下,多谢!http://tinyurl.com/3568p2f #

发布一个简单的ssh-twitter客户端

ssh-twitter是一个使用命令行运行的twitter客户端,具有常见的一些功能。
您的linux系统需要满足以下环境条件:
perl (5.8+)
LWP::UserAgent扩展

项目主页

中文使用说明文档

>点击此处下载(4.08K)<

安装
----
perl twitter.pl
按提示输入用户名密码,会保存在用户目录下.twitterrc文件中。

读内容
----
perl twitter.pl -r

作者
----
gabriel@dreamingcrow.com

中文支持版本作者
----
54chen<http://www.54chen.com czhttp@gmail.com>

使用截图
---- ssh-twitter

ssh-twitter

项目主页

中文使用说明文档

>点击此处下载(4.08K)<

QCon回忆录

在前天(2010年4月24日),有幸参加了第二届的QCon北京全球企业开发大会。会上有来自facebook\twitter等国际知名企业的技术高手,和来自国内一线互联网公司的高手,对相应研究的主题进行了深刻的交流。

大早爬起床来,困顿中来到大钟寺附近,寻找到目标酒店。

找到目标、进入,入口很开放,不需要有效证件,能找到自己的牌子就能进去了。领了写上自己名字的牌子挂上脖子,感觉质量差了点。

凭感觉上楼,无特别标识。找到主会场。

未遇到同事,领同声传译耳机,无身份证,不给领。正巧电话淘宝老同事正赴现场,帮领,一枚。

会议开始,现场满座。

第一场,万众期待的eclipse之父Erich Gamma没有出现,颇有些失望。取而代之的是一场敏捷开发管理的内容。相关的现场笔录在 http://www.54chen.com/architecture/april-24-live-stream-qcon-posts.html

第二场,facebook的大侠,讲他们咋用memcached,这哥们具说是设计了个memcache的udp读取的方法,得了个美国的奖。同声传译的影响太大,断断续续的理解了些大概,感觉他们用的二级甚至三级的memcache的方案是很不错的。这哥们自己也同意,方法有些山寨,但好用才是王道。他一定不知道什么是“山寨”。

第三场,twitter的大侠上场,兄弟胡子好浓密呀,哪国人仕?胡子浓密的一定是高手。讲了他们在使用时间片的分步数据方案时的问题。

然后基本上就到了中午十二点了。。。开饭时间一到,拖了十分钟,结束了早上的会议。

同淘宝的老同事一起吃饭,不到四十分钟吃饭的时间。

回到主会议现场,下午是国内讲师。这时第一次见到了台上的Fenng,平心而论,要比头像上帅,还是特意处理过的?

然后第四场一开始,是阿里巴巴的国际站做镜像的一些经验。东西讲得不深,很大面上的来讲~~听一半,笔记本没有电了,撤到外面去上了个厕所。

回来的途中,遇到了Fenng。第一眼他没认出来。看牌子看出来了,看来我的头像也没有本人帅。。。拉拉家长换了名片后,他语重心长的说,科学院一定要坚持办下去。那情景,和某某革命电影情节类似,不过我一时想不出来了,很久没有看革命电影了。激动之下,我解释了下为什么是“五四陈科学院”,是为了纪念一场胜利的革命(1919年5月4日在北京爆发的中国人民彻底的反对帝国主义、封建主义的爱国运动)和70年零一个月后另一场革命未胜利的惨剧,借以勉励,同志仍需努力的道理。

再进入到现场,阿里的大侠已经行文渐尾。

第六场是去哪儿网站的吴永强大侠讲他们的一些运维经验,这哥们也是雅虎出来的,雅虎的运维肯定被继承了过去,所以稳定是没得说的。

掌声中,进入到第六场。人人网的高级技术总兼,我们的老大黄sir,飘逸地带着mac大本上场。这里要多讲一讲,黄sir一向重视技术,对人人网从小到大的发展了如指掌。几个主题下来,从人人网的发展,到我们的nuclear项目介绍,再到王志亮大侠的rose框架,行云流水。

再掌声中,大家对nuclear的设计很感兴趣,会后纷纷在外面探讨起来。按压不住,我也去和前辈们过过招。这一过招,认识了不少朋友,其中还有来自盛大的俞前辈,对dynamo原理理解深刻,经验丰富,似乎盛大在考虑开拓S3类似的业务。另外也和twitter上一系列的同志对上了号,交换了名片。

一番探讨之后,回到现场,新浪微博的大侠timyang已经讲了大半了,听了个大概,作了些笔录。

时间过得很快,一天过去了,最后的时候,找到timyang简单聊了下新浪微博的一些动向。

然后,同原同事、现场twitter上一些朋友,一一告别。Fenng和infoQ的老大(神似)忙里忙外,没顾上去打招呼,领了个t-shirt作纪念,离开。

酒店里一天没有自然光线,感觉很晕。。。(不排除是因为起太早)

国内类似的技术聚会,聚到一起的大侠们越来越多啦。。。感叹一下。

54chen Twitter Memo 2010-04-25

  • 如果不拔,你将疼不欲生 @nshen121: 谁知道拔智齿疼不疼啊... #
  • 要相信科学 @nshen121 @54chen 看样子你很有经验啊.. #
  • 其实人生远远不止如此,肯吃苦也苦一辈子的大有人在。RT @laiyonghao: 拨,痛一阵子,不拨,疼一辈子。人生也一样,肯吃苦,苦一阵子,不吃苦,苦一辈子。RT @54chen: 如果不拔,你将疼不欲生 @nshen121: 谁知道拔智齿疼不疼啊... #
  • [RT]乾鹏: 华清嘉园是位于北京四环外的一个著名小区,因为紧邻若干著名高校而被首都人民所熟知。2000年开盘价格为5000元左右,目前二手房价格在3万元以上。玉树地震,中央财政紧急下拨青海地震救灾资金二亿元,大约价值20套华清嘉园三居室,北京市捐助一千万,大约价值1套三居室。 #
  • http://ur.ly/9II2 网易不要命了!!居然说了实话!!! #
  • 梯子自备@tina_tong: 打不开呢。。 #
  • 由盛大同学验证属实 @tinyfool: 从未听说 RT @fangtr: @jeffz_cn @tinyfool @virushuo 求证,凤姐在盛大出现 #
  • 经搜狐内部人员证实,负责搜狐无线wap游戏业务的技术人员彭小琦在家中意外离世,具体原因仍在调查之中。借此,DoNews对离世的彭小琦表示哀悼,并希望各位在IT岗位工作的劳动人员注意身体健康。 #
  • 袁腾飞:那个。。。国民党失败的原因咱们今天就不说了 因为容易联想到今天的政局。 #
  • 杯具了,看着这位0bug老师被相关不相关的人嘲笑得不行,得出一个道理,做人一定要谦虚,不管什么时候。 #
  • 同顶,原来tim yang是新浪的,以前探讨nuclear的时候一直都很疑惑是何方神圣 RT @Fenng: 期待!RT: @xmpp: 我的qcon beijing 2010 topic《构建可扩展微博架构》,“可扩展”指在面临突发海量访问量,发布信息量,用户量规模持。。。 #
  • 万岁 RT @tinyfool: RT @hanlei: 念力威武。 RT @lianyue: 同学们,跟我一起念:新黑板,会有的! #
  • 明天要停服 而且都是自愿停服 没有人强制的 不准乱说话 #
  • 乾鹏 : 胡锦涛总书记到玉树孤儿学校看望学校师生时,在教室的黑板上题写了“新校园,会有的!新家园,会有的!”昨天(4月19日),记者从校方获悉,该块黑板已被校方珍藏起来,并将在今天运送到西宁博物馆永久保存。黑板没了,老师带着同学们一起念:新黑板,会有的! #
  • *{filter:gray} #
  • QQ微博邀请码2枚送,有人要没 #
  • b92ca60c 前面还有个invite@JerryChoi: @54chen 可以给我一个不?谢谢 #
  • 潘帕斯不羁的风:“中国只有一位领导人,他叫敏感词,中国只有一位罪犯,他叫临时工,中国民众只有一个状态,他叫不明真相,中国只有一种声音,他叫新华社通稿,中国人民只有一句心里话,他叫草泥马!” #
  • 得知TAOBAO search的老东家兄弟们要来北京参加QCon 吃饭 必须的 #
  • 我这主题被你看中了?@wwek: @54chen 54chen你好 能提供 WordPress主题么 #
  • 最近,CNNIC又向注册商下发出了一则通知,要求各注册商对于2010年4月19日9时以后注册的国内域名将不再提交域名注册申请表 #
  • [RT]徐瑜骏 : 矿难一来,就没人搭理疫苗了,孩子们于是不了了之;地震一来,就没人搭理矿难了,矿工们于是不了了之年复一年日复一日的新闻盛宴、悲剧不过就是人们解闷的新鲜谈资。 #
  • QQ微博邀请码 http://ur.ly/aBfr http://tinyurl.com/2vshzze 需者自取 #
  • 左边一个右边一个? @Fenng: 透漏一下,赵姐夫 ( @jeffz_cn ) 旁边做着两位美女。 #QCon #
  • http://tinyurl.com/29up93z 4月24日QCon现场直播流水帖 这是一个流水帖 请大家明天再关注 有比较大的一些公司的架构讲解 #
  • 不在twitter作流水是因为还有部分的朋友是不在twitter上的 #
  • 不行呀,明天我来,我的本号称供电9小时 @Fenng: 演讲接近尾声。电力不足,接下来的几个话题请其它几位同学继续直播吧 . #QCon #
  • http://ur.ly/ahec 有钱女露富,可怕的一幕发生了......... #
  • qiyi.com已经说明了百度的心思 起义 #
  • Hi,I know GFW @shjunya: @54chen Hi.Do you know 金盾? #
  • #QCon 才连接上3G #
  • http://ur.ly/agbv 连接上网,开始直播 #
  • Scrum doesn't work in china
    这哥们的图很牛B #
  • http://tinyurl.com/37am8qk 现存是茶歇时间,下一个是facebook的技术经理来讲他们使用memcached的经验 #
  • 插播一下,这哥们长得很帅 #
  • 哥们太点背了,投影又坏了 #
  • 兄弟在现场?@wolfdeng: RT @54chen Scrum doesn't work in china
    这哥们的图很牛B //中国是共产主义社会,而Scrum正是基于这个理念。 #
  • facebook 答问时间了 #
  • twitter的系统工作师开始讲了 #
  • #QCon 同声传译有点烂 #
  • #QCon cassandra 意料中出现了 #
  • 发一推给所有人的时候,尽量在一秒内,而且要保证120万的推送量 #QCcon #
  • #QCon 遗憾,时间不够瞧 #
  • 笔记本显示,24%电量 #
  • 跟原来淘宝的老同事坐一块去了,文笔记本电池不行,还是不能撑一天的内容。 @Fenng: #QCon 同声传译有点烂 /via @54chen //没遇到你呢。 #
  • 看到活的@Fenng了,在台上,比头像要帅 #
  • http://is.gd/bFJul 在讲阿里巴巴国际站架构#QCon #
  • 杯具了,10%的电了,寻找插座 #
  • 没撑到最后,关机了,没电了。。。 #
  • 现在才有空上推,这一天认识了不少人,把ID和真人联系起来了,还与原来淘宝的同事会面,真的很高兴#QCon #
  • 本来要整理下笔记本没电后用笔记录的内容的,因为明天还要去清华万博和同学们分享一些CMS二次开发和搜索相关的内容不得不推迟整理 #
  • 兄弟是哪位呢,交换了明片没?:) @chaifeng: @54chen 上午在 #QCon 看见你上推了,真是不好意思,我站在你背后 ;-D #

4月24日QCon现场直播流水帖

才连接上3G,开始直播

Eric Gamma因为冰岛火山灰原因,没能到,更换成了Scurm的主席

 

1.scrum agile
30+years管理经验
存在的问题:
1.在公司和团队的环境中,存在沟通问题
2.组织的管理层没有关注到知识性的工作与体力性工作之间的差异
3.高技术的工作人员存在优先选择的问题
4.人们觉得我们不了解我们工作的复杂性

agile宣言
四项价值观:
个体和交互重于过程和工具
可工作软件重于详尽的文档
。。
12个原则:

要经常性地交互可用的软件,周期从几周到几个月不等到,交互的时间越短越好(经常和客户沟通)
最重要的一点:激励项目人员,调动工作经验,钱不是万能的
非常有意思的原则
面对面的交谈
可用的软件是衡量进度的主要指标
项目周期需要保持长期稳定,要有节奏,不要过多催促
技术的精益求精及对设计的不断完善将提升敏捷性
尽最大可能简洁
允许团队自己放手去做,相信你的团队成员,他们会犯错误但是可以理解的
团队经常地自我反省如何提高技术能力

Scrum 不仅仅用在软件上,其他用途也是可以的
Scrum的角色职能
ScrumMaster的误解:这个角色不是项目经理,是为这个团队提供服务的。5-12个人组织团队
产品的backlog:产品功能表
任务表:sprint backlog 在实现上述的功能,我们要做些什么,这并不是真正意义上的时间表

sprint planning:30天要完成这个工作
日常会议
sprint review
sprint retrospective

是一种风险管理的方式,把风险降到最低,特别是大规模开发某个程序的话,可以规避这种风险
可以经常性问客户这样行不行
它是一个非常科学的方式

三个原则能解决很多问题:
询问团队人员
检查代码、检查工作程序
快速提供成绩

有许多问题会导致失败:
1.文化和不信任
2.投资人之间的交流不畅通
3.设计人员同时做多个项目
4.没有遵循sprint
5.外行人加以干涉
6.团队成员没有全力投入(我帮不了你,这不是我的事情)
7.scrum master成了项目经理
8.工作不够迅速

被误解的一些:
Done:必须是可交互了
团队没有投入到改善工作中去
他们经常去探索问题而不解决
对个人的奖励而不是团队奖励

Scrum doesn't work in china
这哥们的图很牛B

中国是共产主义国家,是可以使用scrum的

文化对scrum的影响

讲一个指数,power distance index
另一个:Cultural agility index
个人主义和集体主义的文化

根据agility index 在中国是可行的 而且是更有利的执行

管理人员的指令

专业经理人官僚的作风

中国的小道消息文化

绩效的评估

避免员工与家庭分开

对成员要有耐心

下一个是facebook的memcache实战:

memcache@facebook 企业的周五,穿正装
how big is facebook?
4亿用户
1000个服务器???错了,上千个服务器

facebook memcache规模
400M gets/s
28M sets/s
2T
收:9.7M/s

图很cool
facebook terms
tier:层级
cluster:数据中心
ToR:top of rack switch
memcache/memcached

游戏中的memcache规则
get : on miss query data and set(这点我赞同)

short profile
PHP并行数据查询:php polling IO  / 有一个PHP异步IO的方案?
用户的好友信息缓存效果并不是很好
把大数据和小数据分类

序列化与压缩
fb-serialization:快3倍 小30%
gzompress serialized string

mcproxy
scaling servers

增加服务器
查5000个好友的时候 用UDP解决这个问题 测量时间
热门的页面:把key复制 公布热键
replicated keys

举例说在profile表里的一个字段confirmed int:Mirrored keys

mutexes:锁 (这个方案用图演示的,感觉会有可能出现一次出不来信息)

公共主页的数据更新方案:多级memcache方案

删除的一致性:schema-version

delete replay:
delete can fail
log failed deletes
用了iptable

McSQL

测试:
你的动作要快,不要影响系统

python and ctypes
write tests not test frameworks

memcache今后的发展规划
有限的解决方案

下一位是:twitter

twitter的大胡子哥们 what's real-time data?

在讲什么是tweet
memcached for reads

同声传译太烂了。。。
根据主键进行分区的例子

根据主键进行分区的例子和根据用户进行分区会有困难

twitter是根据时间来分区,一开始考虑不是很好的办法?这是一个非常临时性的分区方案,但也能满足99%的查询
将来的解决方式:nosql

实时数据的解决方案:适时的服务

通过offline的解决方案

发布一个新的tweet在timeline里排序,当你tweet的时候开始推送

通过提前的处理,可以提高处理量

一个表格对比08和10的tweets速度

只把数据保存到了内存里,是昂贵的

发一推给所有人的时候,尽量在一秒内,而且要保证120万的推送量

social graph:

所有数据都从内存里读,单元性地读取数据,把问题从大化小。
按照用户分解数据

数据二级索引
(看上去是复制两个维度的数据)

flockDB?开源的

分布性的存储中的数据一致性

分区和索引变得越来越复杂了。。。

(时间不够了。。)

吃饭时间,下午再来。。。

回来了,在大宴会厅听阿里巴巴国际站的架构。主要是境像。

数据同步1.0

SQL复制的方式会带来数据冲突,比如说批量操作。

双站点应用拆分的问题。

CAP原理

写数据一致性和可用性

读数据容忍一致性,境像

结论:读应用更容易实现跨IDC的部署

数据同步会放大数据不一致

从设计上避免数据完整性的问题

设计业务流程的时候需要避免跨IDC的WEB Flow

阿里的读应用基本是从搜索来或者是cache来

缺陷:

双向同步的冲突

解决业务冲突

双站点扩展性已经好了很多

进入第三阶段:多站点 全境像

目标是所有机房的所有应用都必须有跨IDC的备份,数据亦然。

数据同步瓶颈分析

受制于为了满足数据一致性而对写入操作进行的排序

数据同步2.0设计原则

在数据库层面记录数据变更

并行所有可以并行的内容

有选择的侵入业务

merge操作

写应用的镜像方案:

双master在实现复杂性上会带来问题

可维护性提高

(笔记本没电了。。。)

后面还有“去哪儿”网站架构、人人网架构、新浪微博架构。。。晚上回去再补上来。。。

PHP上传进度条深度解析

随着互联网的发展,越来越多的技术开始注重用户体验,以人为本才是长久之道,于是在上传的时候,大家都不再满足一个单一的“浏览”按钮,纷纷推出了带上传进度条的功能。而作为解释型语言的PHP,如何做到对上传文件的检测,如何实现上传进度条以其背后的原理,54chen将在本文中一步步展开。

一. 实现篇

一般情况,用PHP实现上传进度条就下面两种方法:

1.APC扩展(作者是PHP的创始人,5.2后PHP已经加入APC扩展)

2.PECL扩展模块 uploadprogress

不论是APC还是uploadprogress,都需要编译源码,因为原有的PHP函数根本不可能读取到临时文件夹里的东西。下面来看如何使用以及关键的代码:

APC实现方法:
1.安装APC
2.配置php.ini,设置参数 apc.rfc1867=1
3.关键代码:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上传请求
$status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
$status['done'] = 1;
echo json_encode($status);  //输出给用户端页面里的ajax调用,相关文档请自己寻找
exit;
} elseif (isset($_GET['progress_key'])) {   //读取上传进度
$status = apc_fetch('upload_'.$_GET['progress_key']);
echo json_encode($status);
exit;
}
uploadprogress实现方法:
1.使用PECL 安装uploadprogress
2.php.ini里面设置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”
3.关键代码:
if($_SERVER['REQUEST_METHOD']=='POST') {
if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
$upload_dir = 'your_path/';
$ext        = strrchr($_FILES['video']['name'], '.');
$sessid     = $_POST['UPLOAD_IDENTIFIER'] ;
$tmpfile    = $upload_dir . $sessid;
$sessfile   = $upload_dir . $sessid .$ext;
if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {
//上传成功
}
}
} elseif (!empty($_GET['sessid'])) {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type:text/html;charset=UTF-8");
$unique_id = $_GET['sessid'];
$uploadvalues = uploadprogress_get_info($unique_id);
if (is_array($uploadvalues)) {
echo json_encode($uploadvalues);
} else {
//读取进度失败,另外处理逻辑
}
}
二. 原理篇

注意上一篇中的红色函数。

下载到uploadprogress1.0.1进行源码分析,在代码中作了注释。

static void uploadprogress_file_php_get_info(char * id, zval * return_value)

{

char s[1024];

char * filename;

char * template;

FILE *F;

TSRMLS_FETCH();

template = INI_STR("uploadprogress.file.filename_template"); <<这里读取设置好的模板

if (strcmp(template, "") == 0)  {

return;

} else {

filename = uploadprogress_mk_filename( id, template );<<<存在的话,会创建

if (!filename) return;

F = VCWD_FOPEN(filename, "rb");

if (F) {

array_init(return_value);

while ( fgets(s, 1000, F) ) {<<<从流中读取一字符串 *s结果数据的首地址;1000-1:一次读入数据块的长度,其默认值为1k,即1024;F文件指针

char *k, *v, *e;

int index = 0;

e = strchr(s,'='); <<<查找字符串s中首次出现字符=的位置

if (!e) continue;

*e = 0; /* break the line into 2 parts */

v = e+1;

k = s;

/* trim spaces in front of the name/value */

while (*k && *k <= 32) k++;

while (*v && *v <= 32) v++;

/* trim spaces everywhere in the name */

for (e=k; *e; e++) if (*e <= 32) { *e = 0; break; }

/* trim spaces only at the end of the value */

/* http://pecl.php.net/bugs/bug.php?id=14525 */

//for (e=v; *e; e++) if (*e <= 32) { *e = 0; break; }

if (v != NULL) {<<<当文件有内容时

for (index = strlen(v); index > 0; index--) {

if (v[index] > 32) break;<<<累计

v[index] = 0;

}

}

add_assoc_string( return_value, k, v, 1 );

}

fclose(F);

}

if (filename) efree(filename);

return;

}

} 在源码中还能发现:

PHP_MINIT_FUNCTION(uploadprogress)

{

REGISTER_INI_ENTRIES();

php_rfc1867_callback = uploadprogress_php_rfc1867_file;

return SUCCESS;

} 在MINIT中修改了php_rfc1867_callback,抽取uploadprogress_php_rfc1867_file的关键代码:

upload_id = emalloc(strlen(*e_data->value) + 1);

strcpy(upload_id, *e_data->value);

progress->upload_id = upload_id;

progress->time_last  = time(NULL);

progress->speed_average  = 0;

progress->speed_last     = 0;

progress->bytes_uploaded = read_bytes;

progress->files_uploaded = 0;

progress->est_sec        = 0;

progress->identifier = uploadprogress_mk_filename(upload_id, template);<<<在指定的模板位置放下了临时文件

progress->identifier_tmp = emalloc(strlen( progress->identifier) + 4);

sprintf( progress->identifier_tmp, "%s.wr", progress->identifier ); 关于php_rfc1867_callback是什么,可以看哥学社另一哥鸟哥的分析 http://www.laruence.com/2008/11/07/586.html

三.总结

在探测临时文件大小的时候,APC和 uploadprogress其实是大同小异的方法,先记录,再取大小百分比。

关于哥学社: 哥学社是一个自由博客组织,以提高原创技术博客质量,为成员博客增加更有效评论,由来自腾讯、百度、盛大、人人网、新浪、奇虎、TOM等各大企业的哥们共同起草发起。

关于五四陈:
54chen(陈臻),人人网分布式存储研究人员,业余时间混迹于各技术组织且乐此不疲。目前关注实施PHP培训。对flex等前端技术有一点研究。
个人技术站点:http://www.54chen.com/ 。可以通过电子邮件 czhttp@gmail.com 联系到他。

本文提及的文章:

http://www.php.net/releases/5_2_0.php

http://www.ibm.com/developerworks/cn/opensource/os-php-v525/

http://www.laruence.com/2008/11/07/586.html

54chen Twitter Memo 2010-04-18

  • 50亿 吓我一跳 原来是从上衣口袋换到了裤子口袋里了 #
  • 哥学社成立一周,http://tinyurl.com/ye3oqay 已经参加的哥有:腾讯深大、百度鸟哥、盛大坦克、人人网54chen、新浪小Z、奇虎虫zi、TOM烂叶等名企博客哥 #
  • 首先,没有feed导入blog;其次,用户名不能以数字开头;再次,注册的时候明明只收听陆川一人,全给我收听了。失败。腾讯微博试用总结 #
  • 北京公务员错峰上下班导致早高峰延时1小时,可以看得出这个组织是多么大 #
  • 公司送一张Qcon的票,可以现场看活的@Fenng了 #
  • RT @d_yang: 政府下的波兰人民,该是何等的幸福啊! #
  • twitter上有腾讯微博的人吗,麻烦帮我把我的用户名chen-_修改成54chen,谢谢了。 #
  • 一兄弟创业收简历感叹:投上来都是硕士 #
  • 你还别说,还真是不好招高中生 RT @nodex: 是不是不如高中生靠谱 #
  • 有这要的主管很性福 RT @blogkid: 看起来大多数技术团队都有此需求 RT @karlzheng: 我的主管刚刚和我说,我们需要两种人,1、牛人,2、女人,可见技术部门女性同胞的缺乏啊! #
  • 得知跟了我半年学习PHP的学生之一偷偷去找了工作开始上班了觉得挺有成就感的,领进门了,以的修行看你们自己啦 #
  • 我的心 在等待 一句话形容一天的工作 总是因为别的团队的不专业发包影响了预计的进度 #
  • 印了半年的名片,终于可以发出去了。。。哇哈哈RT @Fenng: 申请下周休假。周五上午去北京,参加 QCon,周日下午回杭州。 #
  • 顶下混脸熟 RT @taiwen: 大会现场我试着口播一下,让大家自己写上,也是一次很好..RT @danoyang: @taiwen 可以稍微低调一下的组织Qcon的同学相互交换Twitter ID么,比如说 在胸牌上印个头像加名字? cc @fenng @bryanzk #
  • 下周六才去 @muxueqz: @54chen 哈哈,你没去现场混脸熟? #

54chen Twitter Memo 2010-04-11

  • 突发奇想,不知道有没有ssh下的twitter客户端呢? #
  • 搜了下没发现有现成的,我抽空操刀做一个 RT:@pillarchy: 哇塞,让我想起了十年前,telnet玩bbs的日志,好怀念呀。 现在上水木我还是习惯用ssh登录,呵呵 #
  • 不错啊,我建个开源项目吧 http://tinyurl.com/yb356uv 欢迎各路高手加入 RT:@Lin_Cong: RT @54chen: 我这有个支持cmd跟irc的twitter lib 需要么? #
  • cool 试用一下给改进成中文版本 RT:@ahxxm: 关键字 twitter command line ,不过ssh好像不能显示中文? #
  • perl版本,巨简单,哇哈哈 #
  • 这些天都在看山西的矿难,剩下的人还有活的吗,CCAV在昨天的新闻联播把整个事情描述得非常的社会主义好。 #
  • 已经添加,用perl搞非常简单,两个文件搞定了,兄弟有兴趣搞个C版的吧@Lin_Cong: RT @54chen: 不错啊,我建个开源项目吧 http://tinyurl.com/yb356uv 欢迎各路高手加入 R || 加我入会 #
  • 谁研究过katta的 一起聊聊 #
  • 坏总,打开就是register.php 邀请码啥的 RT@huairen: http://tinyurl.com/ybshlnz 哥也被腾讯围脖了。 欢迎来围我。 #
  • 在忙着迁移到应用中去,有新动向我一定最快通知 RT:@XipingLiu: @54chen nuclear开源申请结果如何了?? #
  • 去我家乡做贡献了啊,彝族分白彝和黑彝,白彝年轻时漂亮,过三十岁老得快 RT:@董立强 (Skiyo): 刚回来.感觉那里人好黑啊 #
  • 长见识了 @helio_wu: 云南的少数民族服饰别致莫过于花腰傣的帽子吗? RT: @yangpigui: 还有红彝、花彝。很久以前认识一个很漂亮的花彝。@54chen 去我家乡做贡献了啊,彝族分白彝和黑彝,白彝年轻时漂亮,过三十岁老得快。 #
  • IT业商战手段实例:利用群众爱国热情攻击投资方;病毒攻击用户数据,删除用户私人日志。 #
  • 我说这个项目http://is.gd/bieVn 等我和马云李彦宏一样有闲的时候再提交代码,你们都说没希望了 #
  • 初一看吓一跳,再一看还不如初一看 @Skiyo: 真他吗纠结 RT @ning_li 我们女孩子喜欢的是正经里带一点不正经,但这点不正经还不耽误正经的那种。 女孩子追求安稳,但又不能太安稳,安稳里要带那么一点不安分,但这点不安分又不能破坏安稳。 #
  • http://is.gd/bihlZ http://ur.ly/9reJ http://tinyurl.com/y866r34 我在各处建微博 #
  • @neocn: 兄弟,你是腾讯的neo呢 还是加拿大的neo 异或是同名? #
  • 一个技术组织的诞生: http://is.gd/bjCxV 哥学社 #
  • 我的凤凰微博 http://is.gd/bjMmI 是home邀请我的 是的,你没看错url #
  • 哥你裸求的时候多求一个 RT @Skiyo: 冰天雪地裸求邀请码 #