背景php
从2015年鸟哥的技术分享,咱们知道PHP7是对底层实现得一次彻底重构,函数调用机制和内存管理等不少方便作了优化,使PHP性能有了很大的提高,至今PHP7经历了多个版本的迭代,经常使用的扩展和插件也基本作到兼容了PHP7,升级PHP7的难度愈来愈低。mysql
随着闪贷业务的快速发展,推广业务和API接口的代码变得愈来愈复杂,页面响应时间变得愈来愈慢,必定程度上影响到用户的访问体验。所以最近花费了不少精力在优化网站的性能上,力求使用户获得更好的体验。升级 PHP 7 做为其中一个重要环节,取得了可观的效果,后端 web 服务器的负载和核心页面的响应时间都下降了不少。web
PHP代码升级sql
从PHP官方升级文来看,PHP7相较于PHP5语法基本改变不大,作到了向后99%的兼容,可是项目中仍是有不少编码不规范或者使用建议废除的函数致使的不兼容,使用的ThinkPHP3.1框架也有不少不兼容的地方:mongodb
preg_replace的e修正符的弃用,使用preg_replace_callback函数替代,例如:后端
preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name);
替换为
preg_replace_callback('/_([a-zA-Z])/', function($r) {return strtoupper($r[1]);},$name)
PHP7对间接变量的解析顺序和PHP5的解析顺序不一致,若想保持一导致用{}保证解析顺序服务器
$foo->$bar['baz'] // 解释为 ($foo->$bar)['baz'] 替换为$foo->{$bar['baz']}
$foo->$bar['baz']() // 解释为 ($foo->$bar)['baz']() 替换为$foo->{$bar['baz']}()
Foo::$bar['baz']() // 解释为 (Foo::$bar)['baz']() 替换为Foo::{$bar['baz']}()
使用 php7cc 辅助进行代码检查,php7cc 能够检查出来项目中大部分代码不兼容的状况,而后输出到文本中逐个文件作兼容处理。也能够接入项目打包测试流程作代码检测。php7
扩展替换框架
PHP7之后废弃了mysql和mongo扩展,项目中使用的ucenter使用的db类使用的是已经废弃的mysql扩展,使用msyqli扩展作兼容替换。函数
由于mongo扩展在项目中使用太多,并且和mongodb扩展的API一点都不兼容,如果切换必须重写整个底层访问接口,工程量太大,因此使用了 mongo-php-adapter,它是基于 ext-mongodb 的 API 写的 ext-mongo 的适配器,能够不对代码进行任何修改,就迁移到 ext-mongodb 上,迁移成本低了不少。
测试方案
和大部分公司差很少,项目组划分了线下开发环境、预发布环境和生产环境三个环境。一个需求从开发到上线,通常通过几个步骤:工程师在统一的线下开发环境完成开发和简单的测试;再部署到预发布环境,由 测试进行统一的测试和回归;最后,再正式部署到生产环境上。咱们在升级部署 PHP 7 时,也是按这样的顺序递进的: