Tumblr 团队经常在寻找新的方式来提升网站的性能。这意味着要给访问量大的代码增加缓存,找到更快的 CDN 配置,或者升级基础软件。

最近,通过一次跨团队的努力,我们将全部 web 服务器战舰从 PHP 5 升级到了 PHP 7。整个升级是一次有趣的项目,有一些非常酷的结果,所以我们想分享给你。

时间表

这起源于 2015 年秋的一个黑客日(hackday,类似于黑客马拉松)项目。@oli 和 @trav 在 PHP7 RC 上运行 Tumblr . 此时, 很多 PHP 扩展还不支持 PHP 7, 但是有一些非官方的 forks 已经在(非常)试验性的支持了,就算是这样,它还是跑起来了。

这个春天,PHP7 开始变得更加稳定了,我们决定是时候开始密切关注升级了,我们做的第一件事就是打包新版本,这样安装就变得简单并且一致。同时,我们也把我们内部的 PHP 扩展放进了新版本里,这样所有东西都准备好了,随时可用。

我们编写了一个小脚本来升级(或者降级)开发服务器,然后,春末夏初,开始了测试(更多内容请往下看),PHP 包的构建迭代,性能测试和评估,随着它的稳定,我们开始吸引更多的开发者在支持 PHP7 的机器上进行他们的日常开发。

最后,在 8 月底,我们对我们的测试充满自信, 于是我们在生产服务器上的一小部分使用了 PHP7 。两周后,随着逐步增加,所有响应用户请求的服务器都更新了!

测试

当我们进行升级时,测试所有代码并确保它们以相同的方式运行是非常重要的,我们有一些方法来解决这个问题。

Phan. 在这个项目中,我们用它在代码库中查找与 PHP7 不兼容的代码,有了它,找到并且解决这些问题变得非常容易。

我们还有一些单元和集成测试来帮忙确定哪些方面不能像以前一样有效的工作,由于这个项目还在正常开发,我们需要确保没有添加任何没有通过 PHP7 验证的代码。所以我们用 CI 任务来跑所有的 PHP 5PHP7 的测试

结果

那么在项目结束时,最后的结果是什么?好吧,有两件事对我们有很大的改进,一个是性能另一个是语言的特征。

性能

当我们把 PHP7 推到首批服务器上时,很明显我们更关注的是各种图表,以确保事情能够顺利的进行。正如我们上面提到的,我们正在寻找性能的改进,但是实际结果是惊人的。几乎第一时间发现了延迟下降了一半,服务器上的 CPU 负载至少减少了50%还要多。我们的服务器服务速度比原来的快两倍,而且是只用了一半的 CPU 资源来完成的。

以上这些是处理 API 服务的部分图表。正如你所看到的,延迟下降到不到一半,平均峰值负荷现在低于以前的最低点!

语言功能

PHP 7 还带来了许多有趣的新功能,可以让 Tumblr 的开发人员的生活变得更轻松。 一些亮点是:

  • 标量类型提示:PHP 在历史上对于类型安全来说相当差,PHP 7 引入了标量类型提示,它确保传递的值符合特定类型(string,bool,int,float 等)。
  • 返回类型声明:现在,使用 PHP 7,函数可以具有语言将执行的显式返回类型。 这减少了对一些样板代码的需求并手动检查函数的返回值。
  • 匿名类:非常类似于匿名函数(闭包),匿名类在运行时构建,可以模拟类,符合接口,甚至可以扩展其他类。 这些对于记录类等实用对象很有用,并且在单元测试中很有用。
  • 各种安全和性能增强。

总结

PHP 7 真牛逼!

更多现代化 PHP 知识,请前往 Laravel / PHP 知识社区

Tumblr:我们是如何从 PHP 5 升级到 PHP 7 的的更多相关文章

  1. 升级到iOS9之后的相关适配

    iOS9AdaptationTips(iOS9开发学习交流群:458884057) iOS9适配系列教程[中文在页面下方]转自@iOS程序犭袁 (截至2015年9月26日共有10篇,后续还将持续更新. ...

  2. Tumblr 架构设计

    英文原文:The Tumblr Architecture Yahoo Bought For A Cool Billion Dollars 最近的新闻中我们得知雅虎11亿美元收购了Tumblr: Yah ...

  3. Tumblr:150亿月浏览量背后的架构挑战

    Tumblr:150亿月浏览量背后的架构挑战 2013/04/08 · IT技术, 开发 · 9.9K 阅读 · HBase, Tumblr, 架构 英文原文:High Scalability,编译: ...

  4. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  5. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  6. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  7. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  8. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  9. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

随机推荐

  1. 06_java 时间获取练习_Date\SimpleDateFormat\Calendar类练习

     1.获取当前的日期,并把这个日期转换为指定格式的字符串,如2088-08-08 08:08:08 import java.text.SimpleDateFormat; import java.uti ...

  2. 【Django】Web应用开发经由

    [Django开发经由] 本来以为看完网上的入门教程之后就可以看书详细学习一下,没想到手头上的这本书也讲得不是太详细..无奈,不过好在这本书从无到有建立一个网站的流程还算可以,就以这个角度简单记录一下 ...

  3. Algorithm --> 十大排序算法

    十大排序算法 主要排序法有:  一.冒泡( Bubble)排序—— 相邻交换  二.选择排序 ——每次最小/ 大排在相应的位置  三.插入排序 ——将下一个插入已排好的序列中  四.壳( Shell) ...

  4. c++ --> static关键字总结

    static关键字总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...

  5. 基于docker 部署 canvas-lms

    准备:  一台8G内存的服务器.安装好docker, pull一个ubuntu镜像下来, 可以是最新版也可以是官方支持的14/ 16 Step 1: 启动docker容易加载ubuntu镜像.命令如下 ...

  6. [bzoj1355][Baltic2009]Radio Transmission_KMP

    Radio Transmissio bzoj-1355 Description 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. Inp ...

  7. 用SQL语言操作数据

     使用T-SQL插入数据(一)SQL是什么?Structured   Query   Language  :结构化查询语言T-SQL:Transact-SQLT-SQL是SQL的增强版对功能进行了扩充 ...

  8. Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)

    文档主要来自oracle官方文档performance 8.3章节 Oracle数据库提供了Orion,一种 I/O校准工具.Orion是预测Oracle数据库性能的工具,无需安装Oracle或创建数 ...

  9. Python变量赋值的秘密

    在Python中,我们令一个变量等于另外一个变量时,并不是把值传递给它,而是直接把指向的地址更改了.我们想要查看一个变量在内存中的地址,可以通过id(变量) 来查看.我们通过一个小例子来看看这个有趣的 ...

  10. 凡事预则立-于Beta冲刺前

    凡事预则立,在Beta开始前的描述 在Beta项目冲刺开始之前,我们小组组织了一次活动室的讨论,明确了一下分工和即将来临的Beta冲刺要处理的问题和需要继续改进的地方.顺带补上一直没有的照片: 针对几 ...