[PHP] PHP5からPHP7にverupする際にチームで行なった取り組み

  • 1
    Like
  • 0
    Comment

はじめに

以前、[PHP]安定したシステム運用を目指して取り組んだことという記事を書きました。この記事ではPHP7した後のチームの取り組みを紹介しました。
現在、別サービスのPHP7化を進めており再びPHP5と向き合っています。
本記事ではPHP7化のすすめとPHP7化の進め方を共有したいと思います。

PHPの各verのLife cycleはきちんと守ろう

2017年10月時点でのサポート状況。
php_life_cycle.png
http://php.net/supported-versions.phpより

PHP5.5以下はSecurity fixesが終わっているため、セキュリティリスクを抱えた状態になっています。早くverを上げるべき。

しかし、現場はverupに取り組みたいと思っていても、上司からなかなか許可がもらえないということがあると思います。
「セキュリティ事故が起きて責任とれるんですか?起きてからでは遅いですよ?」とセキュリティリスクを盾に交渉してみるという手はどうでしょうか?

フレームワークのLife cycleもチェック

フレームワークも古いとセキュリティリスクを抱えます。
(PHP7になるのでそもそも動かない可能性もありますが。。。)
フレームワークもverupしましょう。

私たちのケースですが、サービスがSymfony1.4で作られていました。
・Symfonyの最新verにする
・Laravelなどの別のフレームワークに切り替える
という選択肢がありました。私たちはSymfonyの最新verにする方を選びました。
理由は
・verup後はPHPもフレームワークも最新verを追っていくという方針になった
・Symfonyはサポートのロードマップが明確で、verupのための計画が立てやすそう
という2点です。
symfony.png

ちなみにSymfony3.4はLTS版なので2020年までサポート予定だそうです。
(本当はLaravel使いたかったな。。。)

PHP7にすることの恩恵

これは有名ですね。
PHP7は大幅な改修のおかげでPHP5系の2倍の実行速度を誇るといわれています。
またメモリ使用量も下がります。感謝感謝。
上司からなかなか許可がもらえない場合はこれも交渉のネタになると思います。
「レスポンスが高速化するのでuserに快適なサービスを提供できます」と顧客満足も交渉のネタにどうでしょう?

PHPverupの権利を勝ち取った後は作業の進め方を決める

私たちは下記の手順で進めていきました。
1. 使用していないファイルは事前に削除しておく
2. 修正有無をphp7ccを使ってざっくりチェック
3. 各verで追加された機能や非推奨になったものをチェックする
4. Symfony1.4とSymfony3の違いを把握
5. Road lapの作成

使用していないファイルは事前に削除しておく

リポジトリには昔は使われていたけど今は使われていないファイルが残っていることもあると思います。verupの際は時間に追われる可能性があるので無駄なものはいまのうちに葬っておきましょう。

修正有無をphp7ccを使ってざっくりチェック

世の中には優しい人がいますね。PHP7に対応しているかどうか、チェックしてくれる「php7cc」というツールがあります。
https://github.com/sstalle/php7cc

php7cc /path/to/my/file.php
php7cc /path/to/my/directory/

こんな感じでファイル単位やディレクトリ単位でチェックできエラーがあると、ファイル名と行数、それと理由が表示されます。
まだverupの予定がなくても、今のうちに対応した書き方に作り直しておくと良いかも。

各verで追加された機能や非推奨になったものをチェックする

要はポイントの学習ですね。
PHP7から例外の種類が増えました。Mcryptは7.1で非推奨になりました。
などなど変更になった点が多々あります。
変更点はPHPのマニュアルにしっかり明記されていますので、確認しておきましょう。
http://php.net/manual/ja/appendices.php
調べた内容はチームミーテイングの機会を設けて共有しておくとよいかもですね。

Symfony1.4とSymfony3の違いを把握

これは私たちの場合ですがSymfonyはSymfony2で大改修されたため、
今までの機能を保持するために新しいフレームワークを知る必要がありました。
気になることをリストアップし、Symfony1.4ではどうなっていて、Symfony3ではどの機能を使用することになりそうかの対比表を作りました。

function Symfony1.4 Symfony3
batch Taskで実装 console commandを使用することになる?
フィルタリング filter Event listenerを使用することになる?
ルーティング ymlで管理 アノテーションでもymlでも管理できる?
テンプレートエンジン PHP twig or PHPどっちでもできそう?
css, js, imgの設定 view.yml asset managerを使うことになりそう?
... ... ...

それから処理のイメージを固めました。
フロー.png

Road lapの作成

工数はプロジェクトによって違うと思いますので工数については触れません。
私たちが立てた手順は、
1. サンプルを作成 (Batch -> Web -> Event listener)
2. 独自ライブラリの移植
3. Batchを移植
4. Webを移植
でした。簡単なものから着手していくようにしました。

errorをキャッチアップする仕組みを作る

結構以降の作業は泥臭いです。エラーチェックなどは自動化しておきましょう。
例えばLint処理やエラーキャッチです。
Lintはシェルを作ってもいいですし、hookで検知してもいいと思います。
やりやすい方法でどうぞ。
あとはエラーキャッチですね。
error.logをモニタリングしておけばすぐにエラーをキャッチできると思いますが、
ついつい忘れてしまうこともあります。
その場合はslackに投げるなり、emailを送信するなり周りにも周知させるような仕組みを作りましょう。
誰かが指摘してくれるかもしれません。

ほかのメンバーにもテストを協力してもらう

テストはやはり重要です。
verupは大きなプロジェクトなので周りをどんどん巻き込んでいきましょう。
みんなにお願いして1時間でも30分でも時間をもらい、会議室を確保して黙々とテストをしてもらいましょう。
各々の観点でテストをしてもらうと思わぬバグが見つかることもあります。

終わりに

verup後の取り組みがやはり重要だと思います。
以前、[PHP]安定したシステム運用を目指して取り組んだことという記事を書きましたのでもしよければ参考にしてください。
どのたかのお役に立てれば幸いです。