将PHP5.3升级到PHP7.1的经历

简而言之

这篇文章是LIFULL Advent Calender第二个十六天的文章。

由于我们在上个月进行了我们的服务的PHP版本升级,所以我将记录下这次的进展和结果。我们从PHP5.3升级到了7.1。

顺便提一下,前几天发布了7.2版本呢。
http://php.net/archive/2017.php#id2017-11-30-1

安裝

请查看公式文件。
http://php.net/manual/zh_tw/install.php

随着升级,我也安装了一个叫做OPcache的中间代码缓存机制。
http://php.net/manual/ja/book.opcache.php

应用程序对的影响

升级版本后的影响确认,请参考以下官方文档:
http://php.net/manual/zh/appendices.php
http://php.net/manual/zh/migration54.php
http://php.net/manual/zh/migration55.php
http://php.net/manual/zh/migration56.php
http://php.net/manual/zh/migration70.php
http://php.net/manual/zh/migration71.php

关于实际受到的影响

很幸运的是,在这次的版本升级中,并没有受到太大的影响,所以代码变更只需少量。
虽然不确定是否有参考价值,但我会具体说明受到影响的变更以及相应的对应措施。

修改自定义会话处理程序的返回值

如果使用session_set_save_handler函数等来定义自定义的会话处理程序,如果返回false/-1作为返回值,则会引发致命错误。
当返回false/-1时,我认为通常是处理异常情况的情况,但即使在这种情况下,我也进行了修正,使其返回空字符或者true等。

 

无效的类名等等。。

以下这些保留字不能再用作类名等,在使用过的地方进行了全部重命名。
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.classes

以下這些預留字不能再用作類名等,在使用的地方進行了全部重新命名。
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.classes

排序操作的更改

尽管这并没有明确记录在文件中,但由于升级,排序行为发生了变化。

我有一段代码想要将传递给rsort函数的参数顺序反转。在PHP5.3中,预期结果是反向顺序的,但在PHP7.1中,顺序保持不变。

$array = array('b', 'a');
rsort($array);
# array('a', 'b')
$array = array('b', 'a');
rsort($array);
# array('b', 'a')
# 入れ替わっていない!???

首先,rsort是一种对数组进行降序排列的方法,在PHP 5.3时的行为可以说是个错误。
所以对其进行了修正,改用array_reverse进行操作。
http://php.net/manual/zh/function.rsort.php

我们还必须注意未明确指出的行为变化(修复错误)。

验证

只需要一种选择,以下是原文的中文释义:就验证而言,

    1. 准备验证服务器

 

    1. 代码修正

 

    测试测试测试

我认为可以通过自动化一定程度的工序和利用工具来简化验证的流程。

准备验证服务器

Ansible + Serverspec 可以用来验证服务器配置。

在服务器的构建中,我们使用了配置管理工具Ansible。请参考https://www.ansible.com/。

由于过去一直使用ansible来构建环境和生产环境的结合,所以对于服务器的采购与PHP7有关的部分只需要替换即可准备好。

我正在为 Ansible 搭建的基础设施创建 Serverspec 测试脚本。
http://serverspec.org/

如果使用Ansible进行构建,可能会有人认为测试是不必要的。
但是,如果本来就错误地使用了Ansible的方法,或者存在不能保证幂等性的描述,我们会单独准备测试代码,因此还是需要测试。

通过对服务器进行代码化,可以降低与更改或重新构建相关的成本。

代码修正

在修正代码时,我认为可以边查看手册边进行调试,还可以利用静态分析工具进行验证。

php7cc是一种用于PHP编程语言的工具。

你可以分析存储库内的源代码,并识别出不兼容php7的代码。

我建议您参考下面的文章,了解更详细的用法。
https://qiita.com/su_mi/items/b9f06a81bdae40b84c61

https://github.com/phan/phan 是一个支持PHP7的静态分析工具。
由于php7cc可以找出致命的问题,所以这只是供参考。

如果想了解更详细的用法等,请参考下面的文章:
https://qiita.com/msmsny/items/46aaeda7e565cfc7ec48

考试

在整个存储库上进行目视确认所有类似的测试是有限的。
我们也准备了以下工具来部分自动化测试。

端对端

我们通常从开发阶段开始构建并运营E2E测试,
进行整个服务的漫游测试。
它会预先指定URL列表进行全面探索,并检查状态码等内容。

我们使用capybara进行测试。
https://github.com/teamcapybara/capybara

通过这个来进行测试,可以发现是否存在致命的问题,并且可以进行相对全面的测试。

HTML差异

除了上述的内容之外,我们还开发了一种可以比较不同环境下的两个HTML差异的脚本。
我们分别访问了php5.3和php7.1的环境,并全面检查了HTML是否存在差异。

通过升级版本,尽管不会出现错误,但也能够修复存在问题的部分。

结果

下面将记录版本升级前后的性能比较等数据。
关于PHP7能够更快的传言甚嚣尘上,究竟如何…

响应时间

PHP7レスポンスタイム.png

顺便说一下,上面的内容是使用QuickSight显示的ELB日志。
我还发布了一些关于QuickSight的小贴士,如果方便的话,请参考下面的链接。
https://qiita.com/to_muu_mas/items/fffe1122a9583d4d6bca

中央处理器(CPU)和内存使用率

PHP7CPU_メモリ使用率.png

这可能也是由于OPcache的引入所产生的效果。
虽然之前已经引入了Apc缓存,但是通过切换,达到了如此成功的减轻负载的效果。

印象

我记录了有关如何进行PHP升级以及升级结果的方法。

即使我公司一直在推动微服务化,但这次升级的服务也是我们从庞大的代码库中脱离出来进行微服务化的其中一个服务。

如果依存关系复杂或者存储库庞大,这些活动的难度会非常高,因此在本次版本升级中,我们能够感受到微服务化所带来的好处。

此外,当进行像上述记录的基础设施代码化和测试自动化时,可以降低对于这种相对较大规模变更的难度。

实际上,在这个PHP版本升级之后,大约两个星期内我们也发布了API服务器的Ruby版本升级。
如果有机会的话,我们也可以谈谈这个话题。

请原生中文翻译以下内容,只需要一种选项:

PR

在房地产出售时,请选择LIFULL HOME’S!

 

广告
将在 10 秒后关闭
bannerAds