PHP5.6→7.3移行が完了しましたPHP5.6→7.3移行が完了しましたblog_admin|2019年05月30日CakePHP187Twitter80Facebook77B!Bookmark37PocketSREチームの金澤です。PHP5.6→7.3バージョンアップが完了しました。PHP5.3→5.6バージョンアップが完了してから約2カ月での移行となりました。今回、その対応内容と結果を報告したいと思います。バージョンアップ準備PHP7化については、有用な記事が数多くありましたので、まずはそれらを参考にさせていただきました。2.8から2.10にバージョンアップしました。CakePHP2.9のタイミングでObjectクラスが非推奨になったため、CakeObjectに名前変更しました。※PHP7ではObjectが予約語になります。対応が必要だったのは主に以下の関数です。__autoloadereg_*eregieachmysql_*split※対応詳細はGithubにまとめました。これらの関数は、幸いにもそれほど対応は難しくありませんでした。今回、ここに最も時間がかかりました。PHP7.2からmcryptはコアから削除されるため、使えなくなります。PECLのmcryptを入れるという回避策もありましたが、この機会にすべてOpenSSLに移行しました。※こちらも、詳細をGithubにまとめています。移行の際は、互換性を維持するためにUTを拡張し、OpenSSL移行前、移行後で暗号化された文字列そのものが一致することを確認しながら進めました。ECB)対応PEAR::Crypt_Blowfishは内部でmcrypt関数を使用しており、PHP7.3では利用できません。今回移行した箇所のアルゴリズムはBlowfishのECBモードで、IVを必要としないはずですが、暗号化処理の過程でなぜかIVを生成していたため少々混乱しました。最後のブロックの余った部分に0x00パディングを行います。OpenSSLでこの処理をするオプションが見当たらず苦労しました。結局、以下のサンプルソースを参考にし、自前で0x00パディングを実装したところ、UTの差分が消えました。CBC対応mcrypt関数で直接BlowfishのCBCモードで暗号化を行っている箇所があったので、そこもOpenSSLに移行しました。これも同様に0x00パディングの処理を自前で実装しています。CakePHP対応PHP7.3に切り替えた当初、CakePHP側でmcryptのエラーが出てしまい、動作しませんでした。以下の設定を入れることで対応できます。true);※当初、PECLのmcryptをインストールして回避しようとしていましたが、@chimpeiさんに教えてもらい、解決することができました。2019ありがとうございます!useOpenSsl設定して確認中です。mcrypt入れないとダメかもしれませんが。互換性があるので大丈夫かもしれません。簡単にはできなそうだったので諦めましたが。2019※本件、英語ドキュメントには書かれていたのですが、日本語ドキュメントには書かれていていなかったため、追加するPRを出しておきました。phpcc事前準備で知っている範囲をすべて対応した上で、phpccでチェックを行いました。(ctpファイルはチェックしないようなので注意が必要です)このタイミングで、PHP4形式でコンストラクタを記述している箇所が見つかり、対応することができました。PHP7.3コンテナの構築と切り替えPHP5.6化のときと同様、開発用コンテナのPHP7.3化から始めました。ランサーズの開発環境はDockerを利用しており、docker-compose.ymlには以下のように記述しております。~/www:/var/wwwPHP5.6環境とPHP7.3環境をすぐに切り替えられるようにしました。構築したPHP7.3のコンテナはタグ名を7.3とし、docker-compose.override.ymlを以下のように記述します。-dとすれば、PHP7.3コンテナにすぐに切り替わります。-dとすれば戻ります。検証環境を先んじてPHP7.3に移行し、動作確認を進めました。PHP-FPMのエラーログを確認しながら非互換を調査。このフェーズで、主に以下の対応を行いました。引数の数が一致しない関数呼び出しの対応スコープの厳密化に伴う対応PHP7.3化後のパフォーマンスサーバーレスポンス移行前に150ms前後であったものが90ms前後に改善。PHP5.3→5.6のときは約20msほど改善しましたが、その3倍のパフォーマンスアップとなりました。CPU使用率CPU使用率はほぼ半減しました。以下のグラフは1台のみPHP7.3に切り替えたタイミングですが、PHP5.6のサーバーが35%前後なのに対し、PHP7.3のサーバーは15%前後の使用率となっています。サーバーを持て余すようになりました。メモリにも余裕があったので、PHP-FPMのプロセス数はそのままで、サーバーをc5.2xlargeからc5.xlargeにスケールダウンして現在は運用しています。今後の予定とお知らせバージョンアップフェーズについてランサーズのPHP、CakePHPバージョンアップは、以下のフェーズに分けて取り組んできました。2.10までバージョンアップすることができました。PHP7化は、バージョンアップを決断したときの大きな目標でした。今回は1つの大きな区切りとなります。2019/11/10にCakeFestが東京で開催されます。CakeFestはCakePHPの世界的なイベントで、2019年は日本で開催されることになりました。※ランサーズは前回の2017年に続き、2019年もスポンサーになっています。今回、提出したCFPのうち、「CakePHP3への滑らかな移行を考える」というテーマが採択されました。CakePHP2から3へのアップグレードは世界的にも大きなテーマであると感じました。ランサーズでは、CakePHP1.3から2へコントローラー単位で徐々に移行してきましたが、1年以上かかりました。CakePHP2→3へのアップグレード難易度はそれより高く、かつ普段の開発を止めずに移行することが求められます。CakeFestに向け、CakePHP3へのアップグレード方法について試行錯誤をしていきたいと思います。©Lancers,inc.。