PHPCON 2015(北京站)之旅

2015-06-17

2014年 PHPCON 上海站举办前夕,老胡问我去不去,当时对这些会议不是很感冒(其实主要原因是没钱),就没去,不过当时我们约定第二年一起去。到今年北京站举办前一个月,老胡发来链接,问我来否,我自然不想做一个放鸽子的人,领导 Allen 知悉后表示他也要去,于是买门票买车票不提。

6月6日早上到达北京,直奔会场,时间刚刚好。此行主要是为了见一见国内的 PHP 大牛的风采(其实我只熟悉两位嘉宾:惠新宸和韩天峰),顺便看看这些会议到底是一个什么样的情况(因为此前曾参加过南京的一个互联网沙龙,看到最后发现全是广告,所以印象极差——也许是因为免费的)。

先来张会议的日程:

首先开讲的是来自新浪微博的胡波,主要讲 Yaf/Yar 在微博里的使用情况——手机微博服务端这一块从 v4 升级到 v5 的坎坷过程。

由于我们正在使用 Yaf/Yar (后来用 Phalcon 替换了 Yaf),所以胡波的内容让我们极是受用,忍不住多拍了几张现场 PPT (强调一下我一般很少拍照片的):

这两张图说明了 v4 到 v5 升级过程中要解决的问题,跟我们产品 v2 到 v3 的升级非常类似。

我们产品 v2 版本为了求速度,用了我们比较熟悉的 Symfony2,后来使用 ab 压测发现 QPS 极低,才 8 个左右,分析了一下代码执行时间,发现 Symfony2 框架启动时间太高,所以 v2.1 时 App 的接口部分换成了 Yaf,由于 Yaf 过于简洁,没有 ORM 之类的模块,从 v2.3 开始新的业务模块用 Phalcon写,所以我们的 v2.x 版本用了3个框架。采用了 Yaf/Phalcon 的新的业务模块速度相对老的速度提升明显。

胡波的内容对我们从 v2.x 升级到 v3 有很大启发,不过后来由于我们的业务改变巨大,v3 核心基本上是一个新系统,所以只能部分实践。

使用扩展,这是性能提升的一部分。因为使用 C 系框架后,性能提升明显,所以这部分也没有实践,为了以后极致的性能提升备用吧。

使用 RPC 框架 Yar 也是我们 v2.x 后来性能提升的一大原因。实际上,后来我们的主要业务全部在 RPC 里实现,大部分 Controller 只是充当一个过滤器/组装器的作用。当然由于 Windows 不支持 Concurrent 调用,导致我帮同事们一个个配环境(在我的推荐下使用了 Vagrant + VirtualBox)——当然这也是好事,全体开发人员的开发环境转向 *nix 系操作系统。

最后当然要说的就是坑啦!

说说 Phalcon 吧,其实我们最初使用的是 Phalcon v1.3.x,后来 v2.x 发布了(说是采用 Zephir 这种堪称 PHP外挂 的语言写的),虽然明知有很多坑,但我们产品的 v3 到发布还有一段时间,并且 Phalcon 的 v2.x 与 v1.x 仅仅只有两处不兼容,代码稍微改一下就可以用 v1.3.x 了,所以我们果断上新版。

新版果然坑,被坑得印象最深刻的两次果断被我记录下来了,如下:

1. find 绑定数组问题

$array = ["a","b","c"];
$robots = Robots::find(
    array(
        'letter IN ({letter:array})',
        'bind' => array(
            'letter' => $array
        )
    )
);

这段代码有些人在运行时报错: Scanning error before 'letter:array})' when parsing...,问题就在于这个特性是 Phalcon 2.0.5 才有的,如果版本低于 2.0.5 的话,就会报错,因为还没有这个特性。
解决办法就是更新你的 Phalcon,下载地址: Download Phalcon

当时我被文档上这段代码弄郁闷了好久,我写得明明很正确,但却报错,找了半天中文字符/特殊字符,最后无意一撇文档版本是 2.0.5,貌似记得前两天更新的时候是 2.0.4,一查果然!话说新增这大的一个特性应该放在 2.1 里吧,0.0.1 个版本更新至于嘛。。。

2. Model save 方法更新失败不报错不抛异常

如果你的表里面有个字段是 not null,而在更新这个 entity 的时候你不小心设置了该字段为 null,那么你的数据将 save 不进去,这不算坑,但不抛异常不报错这也太坑了吧!

好吧,扯太远了,继续我们的 PHPCON,这时候有个人上来讲了关于 PHP 安全编程的内容,前面一部分耳熟能详,后面一部分没认真听,因为看到漂亮妹子了!

哎,要是公司的女同事们都这样多好······

下午的时候见到了韩天峰,由于上午拍了太多照片,下午没电了,就没拍照片。

韩天峰是个喜欢开挂的人,他的 Swoole 就是 PHP 的一个外挂,赋予了 PHP 开发异步、并行、高性能网络通信框架的能力。还是用 Swoole 官网的介绍吧:

PHP语言的异步、并行、高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。

我之前听说这个人是因为老胡,当时他向 Swoole 提交了一些代码,加入了开发组,这才了解到韩天峰。不过老胡这个人天性寡言,不善言辞,不过很有天赋,技术扎实,沉得下心,我从他身上看到了爱因斯坦的影子。

PS:这里本来放了一张老胡的照片,在老胡的强烈抗议下移除掉了。。。

整个会议的两天,在我一再地怂恿下,他都没去跟韩天峰打个招呼。老胡也曾跟我坦白,说自己说话的时候总慢半拍,所以面试很吃亏。其实看老胡的 Github 就知道老胡的水平,进 BAT 绝对不是问题。

又扯远了,算了,我跟韩天峰也不熟,但他的 Swoole 其实我很感兴趣,我们公司也有人在用,做了一个主动推送更新的考勤机,我这部分业务没用到。等以后有机会用的时候再来一篇感概吧。

第一天结束后去了天安门,时值大雨,广场上的行人到卫兵的伞下躲雨,被卫兵驱赶,有个小卫兵叫我大叔,同行的老胡和 Allen 都快笑尿了。。。我只想说,你 TMD 怎么不叫大爷?

回程的路上看到彩虹,我大叫一声,行人纷纷抬头,举机拍照。

第二天,终于看到了传说中的鸟哥,真名惠新宸,ID是 Laruence,好吧,我承认之前一直以为是 Laurence…
鸟哥说他昨天喝多了,头疼,中场休息的时候我在酒店门抽烟,突然发现鸟哥就在旁边,原来鸟哥。。。,以后戒烟的理由又少了一个。。。哎!

上照片:

鸟哥开场照。

这一张是现场表演写代码,演示 PHP7 的一些新特性。

Laurence 的演讲分为两部分,先是 PHP7 的一些新特性以及弃用的一些东西,简单说了一下如何将代码迁移到新版本;然后就是性能。这也是他在 PHP 项目组中的主要工作。根据他自己测试的数据,7的性能提升确实明显,已经达到跟 HHVM 不相上下的程度,瞬间甩开 Python、Ruby 好大一截。目测 PHP 程序员工资要涨的节奏啊!

结束的时候鸟哥回顾了一下成长经历,对我等深有启发。

下午场主要是关于 SAE(Sina App Engine) 和程序员职业生涯的一段介绍,没怎么仔细听。

最后是圆桌会议,听听前辈们的对于 PHP 看法。嘉宾都被问到为什么选择了 PHP,韩天峰回答,因为只有 PHP 的环境被我配起来了。果然是世界上最好的语言!(PS: 其实我的真爱是 Ruby。。。也许正是这个原因,两天的抽奖都没抽到我。)

晚上离开北京,在广场上,八点整,响起了一段伴随着钟声的音乐,Allen 问我,这是什么钟声?我不知道,答:丧钟为谁而鸣?

Allen 道:仔细听,这叫《东方红》。

我环顾广场一圈,看着背包上的 PHP 吉祥物道:感觉回到了七十年代。


附一个现场视频 Think 2015 PHP 技术峰会(北京站)