由php的call_user_func传reference引发的思考

搞技术一定要深入到群众当中

问题的提出 网友bercmisir在院内留言,针对php手册中的call_user_func函数的文档一事,大致如下:
http://php.net/manual/en/function.call-user-func.php
其中parameter下有这样一句话:
Note: Note that the parameters for call_user_func() are not passed by reference.
简单地翻译一下,是说这个函数的参数是不能依靠引用来传递的。
还有一个例子: error_reporting(E_ALL);
function increment(&$var)
{ $var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a."\n";

call_user_func_array('increment', array(&$a)); // You can use this instead before PHP 5.3
echo $a."\n";
?> 输出是:
0 1
而网友bercmisir的问题在于:
call_user_func('increment', $a);输出是0,而call_user_func('increment', &$a);却输出是1,明明说不能依靠引用来传递。

寻根溯源

然后再进一步寻根溯源,这个Note的信息其实是http://bugs.php.net/bug.php?id=24931这个bug中最后处理的结果。
并且在call_user_func('increment', &$a);虽然输出了1的结果,但一般情况下,会有一个警告信息:Deprecated: Call-time pass-by-reference has been deprecated。

这是什么原因呢?
先看一个例子: error_reporting(E_ALL);
function increment(&$var)
{ $var++;
} $x = 1;
increment($x);
echo $x;
?> 结果为2,并且没有类似expected to be a reference, value given的警告信息,相反地,如果将第8行代码修改为&$x,将得到一个废除警告。从而得以验证,其实PHP在传递过程中,变量会根据形参需要的到底是引用还是值来自行决定传输的是引用还是值,并不需要显式地传递(相反显式传递是即将被废除的)。

继续深入

http://www.php.net/manual/en/language.references.pass.php
在php手册中,介绍引用的传递一节,在中间位置有一个Note说到:在函数调用时是不需要传引用的(也就是上节所说的显式调用),在5.3中如果显式调用会出来一个废除警告。

分析源码

有人说:在php中写入,everything is a reference。
查阅php源码,在./Zend/zend_compile.c的1579行有函数定义zend_do_pass_param。(php5.2.13)
其中有这样一句判断:
if (original_op == ZEND_SEND_REF && !CG(allow_call_time_pass_reference)) {打印废除警告。}
大概意思就是说,在传递的是引用,并且php.ini的allow_call_time_pass_reference为否的话,打印警告。
再看zend_do_pass_param使用的地方,可以发现是在parser阶段时,根据参数ZVAL结构体中元素的定义,来传递到底是var还是value还是reference。(php5.2.13 ./Zend/zend_language_parser.y/c 451/3593)

结论

引用其实类似linux里的文件硬链接一样,但和C语言中的指针是不相同的,在parser阶段php会根据上下文环境自行判断是传引用还是值。而本文所提到的call_user_function并不会自行判断传的是引用还是值。所以前面的例子call_user_function在传值的时候不管用,而在传引用的时候得出了正确结果(但其实还有一个废除警告)。

54chen Twitter Memo 2010-07-18

  • 54chen Twitter memo 2010-07-11 http://goo.gl/fb/mUvUc #
  • 西班牙的年轻人活得很轻松,一般年轻人用自己三至四年的收入就可以买一套房子,没有什么供房压力,而且,房价持续下跌,现在已经跌至2005年的水平。所有省会城市的房价都有所下降,其中19个城市房价下跌幅度超过5%,跌幅最大的是首都马德里,每平方米房价为3375欧元。 #
  • @Fenng 看上去是从wiki里拷出来的? in reply to Fenng #
  • http://fmn.xnimg.cn/fmn044/20100704/2325/p_large_PxmC_5b3900016b3f2d0c.jpg 长颈鹿是寂寞专家,很有爱的图 #
  • 工信部网站升级这事,技术难度和折腾系数,都堪比校内网到人人网的转变 #
  • RT刘启荣 : 唐僧一觉醒来 发现悟空跪在自己床前痛哭流涕 问道:“空儿你怎么了?”悟空抹了一把泪 说:“师傅 咱下次睡觉说梦话 不念紧箍咒 好么?” #
  • 开个会回来,看到QQ弹出的新闻,京沪杭房价突破2万每平,很奇怪,不是很久就突破了吗? #
  • hadron海量搜索平台,两条主线,一条以sphinx为代表的c路线,一条以kata为代表的java路线 #
  • QQ微博的logo被一兄弟形象比喻为受精卵,很形象,很生动 #
  • 7月9日晚11时开始,搜狐微博服务暂停。12日凌晨1时许恢复,但其微博禁外链转发.此后,新浪、网易、搜狐、凤凰等各门户网站的微博,甚至包括人民网微博LOGO边上都醒目地标出了“测试版”或“Beta”字样。13 日网易微博也开始维护,目前无法访问,一夜之间各大微博纷纷进入“测试版” #
  • @wolfdeng 八年抗战,快要解放了吧 in reply to wolfdeng #
  • wordpress的升级真的很迅猛,3.0又出来了 #
  • 用sphinx轻松搞定方便管理的多节点过亿级数据搜索 http://goo.gl/fb/bGAMA #
  • @xmpp feed搞到人来讲了? in reply to xmpp #
  • @162cm 被out了 我还在用2.5的 in reply to 162cm #
  • 百度搜索框上了一个输入法,围观 #
  • 同培训行业的校长聊天,说到一个新兴的行业:讲座行业。中国技术不能再依靠低端培训了,而应该是高端的技术讲座+个人兴趣自我学习。 #
  • 这里有监控宝的兄弟吗?最近免费用户老是收到 您的短信配额已低于5条(还剩1条) 这样的通知,其实根本就没有使用过。 #
  • @tinyfool 可乐喝多了容易肾亏 in reply to tinyfool #
  • 国家统计局刚刚公布上半年经济数据,GDP同比增长11.1%,CPI同比增长2.6%,其中6月份上涨2.9%。 #
  • web widget设计,有人搞过没 #
  • 帮一家电信相关的公司 天元网络 招几个2-4年的.net高手和10个左右的java工程师。有意者mail我czhttp at gmail.com,公司还是不错的,是北邮的一位比较有名气的导师开的,行业内名气较高。 #
  • 传华为大批招募网络人才 或再试水互联网服务 http://tech.qq.com/a/20100715/000573.htm #
  • @162cm codedie.com/net不错 死了都要code in reply to 162cm #
  • 同事发的一个生字:騲 #

用sphinx轻松搞定方便管理的多节点过亿级数据搜索

54chen

概述 来自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级),实测千万级数据在0.0X秒和0.00X秒占大多数。 Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,实测30W线上复杂的blog数据需要5分钟,创建1000万条记录的索引可以在50分钟内完成,实测时间比这个更长得多,而只包含最新10万条记录的增量索引,重建一次只需几十秒,实测十万条在一分钟不到的时间。 Sphinx 是一个基于 GPL 2 协议颁发的免费开源的全文搜索引擎.它是专门为更好的整合脚本语言和SQL数据库而设计的.当前内置的数据源支持直接从连接到的 MySQL 或 PostgreSQL 获取数据, 或者你可以使用 XML 通道结构(XML pipe mechanism , 一种基于 Sphinx 可识别的特殊xml格式的索引通道) 。

sphinx安装 安装见 用Sphinx快速搭建站内搜索功能

配置多节点协同工作 第一点,原理
在sphinx.conf中可以配置index段落里的local和agent两个参数,local = blog_1表示使用本地索引名为blog_1的索引,agent = 10.1.1.1:3312:blog_2表示使用10.1.1.1这个机器的3312端口上服务的blog_2索引。这两个参数均可在此段落中重复出现。
利用这两个参数,可进行节点与节点间的配置。如图1所示,一个searchd服务在接到请求时两种使用索引的示意图。 sphinx 54chen 图1 一个searchd服务在接到请求时两种使用索引的示意图

第二点,架构
利用agent参数,可以灵活配置去代理取满足搜索条数的超时时间等等。
如图2,只需要将索引灵活分布,各自除了自己的local索引以外,全部连成相互的agent,使得别的节点也可以得到自己的索引搜索结果,以此得到分布式的处理结果。 sphinx 54chen 图2 一个简单的分布式搜索的例子

第三点,性能
分布索引的情况下,实测千万数据量,大致在500qps左右,没有做容灾的方案,如果想容灾,可以考虑将索引做成在某些节点上重复。总得来说,性能还算可以,更具体的架构方案,可能要和具体的业务来分布效果会更好。

54chen Twitter Memo 2010-07-11

  • 54chen Twitter memo 2010-07-04 http://goo.gl/fb/uMffE #
  • 真想不起来去年是不是也是这么热。。。热爆了 #
  • 当前外面的温度是40.1度 #
  • 哥很有娱乐精神 RT@Fenng: 我要是记者就过去看 RT: @robbinfan: 唐骏:“我没有理由来回应一个和我不相干的人的质问。”昨日,唐骏通过短信回复《每日经济新闻》记者问询时说。同时称,“不过我这里有所有的证书,所以欢迎你随时过来看看……要是回应了就上他的套了。” #
  • 7月3日 infoQ Qclub分享演示文稿下载 http://goo.gl/fb/sKBfl #
  • 一条SQL引发的对order by的思考 http://goo.gl/fb/hjvsp #
  • 工薪族玩单反流程图:http://fmn.xnimg.cn/fmn039/20100707/1050/p_large_29hR_1cf8000059da2d0b.jpg #
  • 这样的制度如何长期坚持,而不担心项目进度? RT @xmpp: 可以分享一下你们的经验 RT @lichuang: @xmpp 是的,我们组的leader是google出来的,现在也是这样要求的.严格的codereview制度不仅可以保证项目质量,也能帮助组内成员迅速成长. #
  • picasa的设置有中一项“是否自动将评论翻译成您的语言偏好”,真不错 #
  • 呆在SNS公司看习惯了用户相册的飘过 RT @162cm: 惊了,业务部门的压力很大呀,不过这个肯定马上被批评 RT @glemir: Yahoo画报尺度够大啊http://bit.ly/cpD9UO // #
  • 谁知道如何修改picasa软件里的地址为co.uk自然不怕墙? #
  • http://url.cn/0Lxeci 做个试验,认识的人去修复 跳啊跳的 #
  • 郁闷哥 http://fmn.xnimg.cn/fmn040/20100709/1355/p_large_GYs8_10090000e6162d14.jpg #
  • 寻找一个好的机制,可以长期去坚持,一步一步积少成多 #
  • 我在chinaunix的论坛账号是cc0cc,注册6年,发帖12,平均每年发帖2. #
  • @kiminotes 个人网站站长真不容易 in reply to kiminotes #
  • 网络团购的监管 不出意外 近期就会有结论 #
  • CCTV与北邮一向保持良好的合作关系,专家出来说了,美国的团购网站,要开办,必须提供个人身份证明、信用评级等等等等。。。。。。 #

一条SQL引发的对order By的思考

热 ==========尽职的安静的分隔线===========
在实际工作中遇到下面一个问题:
有一个表,存有2000万数据。
主键为ID bigint(20) NOT NULL auto_increment
另有一字段time timestamp NOT NULL default CURRENT_TIMESTAMP

故事从这两个字段说起:
sql1需要从这个表中检索出来时间为2010-05-26 11:55:00之并且id号大于20000的前10条数据
sql2需要从这个表中检索出来时间为2010-05-26 11:55:00之并且id号大于20000的前10条数据

两条sql写出来大概是这样子的:
sql1:select * from table where time <'2010-05-26 11:55:00' and id>20000 order by id limit 10;
sql2:select * from table where time >'2010-05-26 11:55:00' and id>20000 order by id limit 10;

并且已经知道表中的数据,在上面所示时间之前的数据要远远多于所示时间之后的数据。如图1所示: 54chen 图1 数据在时间线上的示意图

实测发现,sql1执行时间0.03s,sql2执行时间33s。

为何大于小于运行的速度相比如何巨大?下面来解答。

第一,用explain来观察两条sql的区别 结论:没什么区别

第二,研究order by 将sql2的order by id修改为order by id desc(排序方向颠倒)后,发现速度马上提到了0.03s的水平。
同样修改sql1的时候,速度马上降到了30s的水平。

进行多次测试,排除mysql本身的缓存干扰。

结论:
sql1的运行示意图如图2所示: 54chen 图2 第一条SQL语句快慢解释图

sql2的运行示意图如图3所示: 54chen 图2 第二条SQL语句快慢解释图

综合上面两个图,mySQL在where查询的时候,也许按照where的条件,按照主键的顺序,最后满足条件的,最后进到内存中去,再进行后面的order by时,asc如果在内存中比不在内存中的就要快得多。

未研究真正实现的代码,仅凭感觉验证。
一句话概括是:按照使用的索引,最后满足条件的数据将留在内存里供进一步排序。

7月3日 infoQ Qclub分享演示文稿下载

本次活动以RIA为主题,参会者多为关心RIA及后端数据服务的开发者和管理者。
我的主题是:"Ria的强力后盾:rest+海量存储
主要内容是给参会者分享了淘宝在nginx上作的关于rest的事情,和一些人人网nuclear的原理。
下面是此次会上我所使用的slide。(国外 有点慢 需忍)

54chen Twitter Memo 2010-07-04

近期分布式相关文章汇总

号外:http://url.cn/0ThU83 infoQ的线下技术活动Qclub本周六在知春路京仪大酒店举行,我给沙龙参会者分享来自人人网nuclear的开发经验以及如何运用在RIA上.

五四陈科学院总结

1.54chen解读NoSQL代表Dynamo 这篇文章颇费了心思从构思到成文,把dynamo原理描述得还算是清楚。

2.4月24日QCon现场直播流水帖 这篇是在QCon大会上现场记录的一些不算是太完整的笔记

4.java线程控制器代码分享-根据cpu情况决定线程运行数量和情况 一个根据cpu来执行的线程控制器实现,评论中有高人改进方案。

5.jdbc socketRead0 locked 记一个Mysql的不明bug 在开发nuclear过程中遇到的一个jdbc的bug

6.LinkIn基于Dynamo设计的系统:伏地魔(voldemort)设计中文文档[我是陈科学院译]-完稿 54chen翻译的一个来自国外SNS网站的分布式存储系统文档

54chen Twitter Memo 2010-06-27

  • 54chen Twitter memo 2010-06-20 http://goo.gl/fb/Z8mwX #
  • 通管局最新要求,所有网站现在实行实名制。要求:1,背景为白色的全身照一张(注:最好站白色墙壁前面照)2,身份证正反面照片各一张(注:字迹清晰可见,,要留有边距)3,照片名称以IP命名 #
  • 一般来说,你为别人打工,无非就是两个目的:为了钱(money),或者为了工作本身给你带来的价值和乐趣(fun)。正常情况下,你的行为动机,应该是追求这两者的最大化。 #
  • @danoyang 兄弟所讲是哪家大佬? in reply to danoyang #
  • RT @fuchaoqun:热死洒家鸟 //心要静,不要看美女,才能凉 #
  • http://www.nuomi.com/i/rSMnZnu 一个新的团购网站,下了血本了,40块两个人看3d的玩具总动员3,绝对超值 #
  • 用Sphinx快速搭建站内搜索功能 http://goo.gl/fb/2ThhJ #
  • RT @liut: 我个旧友问我:架构师要写代码么?我回复:不写代码的架构师不是真正的好厨师。// +1 #
  • 按国务院安排,2010年的中秋节9月22日至24日放假3天,9月19日(周日)、25日(周六)上班,国庆节10月1日至7日放假7天,9月26日(周日)、10月9日(周六)上班。接着:上班5天,休息1天,再上班3天,再休息3天,再上班6天,再休息7天,再上班8天 #
  • 临近下班再发一次,http://www.nuomi.com/i/rSMnZnu 是40元电影票,2张,是2张,不要看错了,开抢两小时已经到818人购买了,数量只剩下一百多了,北京的兄弟爱看电影的从速 #
  • 很多哥信不过20块的电影票是不是能看3D,杯具了。。。这是团购,商家合作的,当然便宜了。。。还有买了后票的有效期是3个月,慢慢看也值。http://www.nuomi.com/i/rSMnZnu #
  • 写写代码回来,已经突破了千人了。。。汗啊汗。。。电子商务太恐怖了。。。 #
  • RT @wingoffire:我老婆真好,至少结婚前没要我买房子 //结婚前是不是已经是总级别的人了,前途十分明朗那种? #
  • @wingoffire 十多年,那时候房价还正常吧,不像现在这样变态,贫富差距太大 in reply to wingoffire #
  • 病毒式的推广非常吓人,昨天到今天,不到20小时的时间里,已经买出去了2万张票,http://sinaurl.cn/7UCVH,时间截止是今天 #
  • 刚刚和影城沟通,由于购买人数众多,影城为糯米网开通了三条特别通道。另外,请大家避免集中在同一时间观影,糯米券有效期至2010年9月30日,可放心使用。http://url.cn/3u4jUk #
  • 糯米第一天,81500人已购买,精光。 #
  • 应广大用户的要求,我们跟商家又争取到了一批票,心动的用户别再犹豫了,抓紧抢购吧 http://url.cn/3u4jUk #
  • @Fenng 贵在中和,不争之争。随他抓去,自己玩一阵就成垃圾站了。 in reply to Fenng #
  • 早上收到一邮件:High Availability and Scalability for Your PHP Applications! #
  • 配合nuclear的海量数据搜索系统取名:Hadron. 强子(Hadron)是一种亚原子粒子,所有受到强相互作用影响的亚原子粒子都被称为强子。前段时间那个大型强大对撞机,正是此。希望早日将人人网的海量用户数据全部找出来,达到用户数据的爆炸时代。 #
  • RT @laogao: @yatounini: ^_^ 恭喜涛哥,喜得千金 RT @liut: 女孩,七斤,51cm,面容娇好,吸吮有力。//恭喜恭喜,虎年,在下大令千金两轮,哈哈 #
  • 中国的高科技下层社会 http://www.newsweek.com/photo/2010/06/19/china-tech-workers.html #
  • @sky000 MySQL Cluster你们现在线上用的多吗? in reply to sky000 #
  • @GuoJiayue 我帮你一把,多分享点moko的美女来校内 哈哈 in reply to GuoJiayue #
  • @sky000 看来都是在观望啊 哈哈 观望结束分享一下成果 哈哈 in reply to sky000 #
  • @wingoffire 遇到灵异事件了 in reply to wingoffire #
  • @Fenng 有一个 sms.api.bz的可以看看 in reply to Fenng #
  • 什么是公司的技术文化,如何营造技术文化,靠一人之力是否可行? #
  • @162cm 另外两个问题呢:什么是技术文化,如何营造? in reply to 162cm #
  • @162cm 精辟,文化真的太难了。。。 in reply to 162cm #
  • @162cm 有没有必要为每敏捷团队配备专门的知识培训组织文化专员,这算是什么角色? in reply to 162cm #
  • @162cm 我是说 这个角色,有必要吗? in reply to 162cm #
  • RT @liut: RT @potato1983: RT @PKUbuzheteng: 中宣部李宝柱来北大演讲的时候不无自豪地说,邓玉娇那事几千万个帖子,我一挥手就全部删除。 #

用Sphinx快速搭建站内搜索功能

Sphinx[英] [sfɪŋks] [美] [sfɪŋks]

出自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx 是一个基于 GPL 2 协议颁发的免费开源的全文搜索引擎.它是专门为更好的整合脚本语言和SQL数据库而设计的.当前内置的数据源支持直接从连接到的 MySQL 或 PostgreSQL 获取数据, 或者你可以使用 XML 通道结构(XML pipe mechanism , 一种基于 Sphinx 可识别的特殊xml格式的索引通道)

下面发出操作记录:

10106 wget http://www.coreseek.cn/uploads/csft/3.2/csft-3.2.12.tar.gz
10107 wget http://www.coreseek.cn/uploads/csft/3.2/mmseg-3.2.12.tar.gz

10109 tar -zxvf mmseg-3.2.12.tar.gz
10110 tar -zxvf csft-3.2.12.tar.gz

10111 cd mmseg-3.2.12
10112 yum -y install glibc-common libtool autoconf automake mysql-devel expat-devel
10113 aclocal
10114 libtoolize --force
10115 automake --add-missing
10116 autoconf
10117 autoheader
10118 ./configure --prefix=/usr/local/mmseg3
10119 make
10120 make install
10121 cp -f src/*/*.h /usr/local/mmseg3/include/mmseg/

10122 cd ..
10123 ls
10124 cd csft-3.2.12
10125 aclocal
10126 libtoolize --force
10127 automake --add-missing
10128 autoconf
10129 autoheader
10130 perl -pi -e 's/lpthread/lpthread -liconv/g' src/Makefile*
10131 ./configure --prefix=/usr/local/coreseek --enable-id64 --without-python --with-mysql --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/
10132 make make后出现iconv错误,所以修改configure文件,查找到#define USE_LIBICONV 把1改为0
重新执行configure和make

10157 make install
10158 cd /usr/local/coreseek/etc/
10164 cp sphinx.conf.dist csft.conf
10165 vim csft.conf
10169 mysql -uroot test

10173 touch /data/exceptions.txt
10174 bin/indexer --all
10177 bin/search test 下期将推出中文搜索测试以及分布式方案。

---华丽的分隔线---

向北京本地喜爱看电影的哥推荐:

昨天哥去UME华星提前看了电影 80后 ,严格的说,这电影和80后没有太多关系,故事还是很感人的,适合带MM看。