YADOKARI

PHP7.0へのアップグレードの取り組みとその効果について

アドサイクルで利用しているPHPのグレードアップ(5.6 -> 7.0)を行いました。その実行の背景や手順についてご紹介します。
「開発ブログ」という名前に変えたのに記事をアップできていませんでした。
本日からは、開発のお話を。(ただ、更新頻度は高くないことを宣言しておきます。)
※開発ブログを書く理由は、可能な範囲で開発の状況をご紹介し、アドサイクルがどういうバックボーンで動いているのかを少しご理解頂き、安心してご利用いただくことが目的です。

早速ですが、アドサイクルでは、コアな機能をPHPをベースに開発をしています。

この度、念願(?)であった、PHPのバージョンアップグレードを行いましたので、その時の経緯と方法について記載します。
具体的には、PHP5.6 -> PHP7.0 にアップグレードしました。

<効果>

こちら、精緻な分析ができているわけではありませんが、非常に高速化しました。
▼あるページでの計測結果
・メモリ:1/3に減少
・速度:30~40%改善

何度か試してみると、ばらつきはありますが、速度は30~40%前後は速くなっている様です。噂通りでした。

<実施した背景と方法について>

アドサイクルでは、Laravelというフレームワークを使って開発をしており、Laravelの最新バージョンは5.5で、PHP7.0以上が必須となっております。5.5はLTS(Long-Term-Support)として、長期間のサポートがされていることから、いずれ、バージョンを5.5以上(5.6も2018年にリリース予定?)に上げていく必要があります。
Laravelは非常に便利なフレームワークで様々な機能を提供してくれており、開発期間が短縮できます。そして、最新のアップデートについていくことで、やはり、より便利な機能を常に使い続けることができるのです。(参照:「Laravel 5.5LTS の新機能」https://qiita.com/saab/items/28536a38ab18cf23360c​)

開発期間の短縮は、すなわち、提供できる機能の増加につながります。
Laravelのアップデートはすごく早く、少なくともここ1年半くらいで5.1 => 5.5までリリースが進んでおり、アップグレードは大変なのですが、結果的にはできることが増加し、より良い機能の提供につながるとのことで、5.5のリリースの内容を見た段階から、アップグレードの準備を考えていました。

その最も大きな壁の1つが、PHP7.0へのアップグレードです。
PHP7.0は、その前のバージョンPHP5.6に比べ、速度が2倍、メモリ使用量も抑制され、CPU負荷も少ないとのことでそれだけでも、アップグレードの魅力は満点です。

なので、いつやろうか、いや、時間があるなら機能強化をしたいなと迷いつつ、考えていました。
やはり機能強化と並行でやる場合、どうしても機能強化を優先してしまいがちですよね・・・。(利用者にとっては、PHP7の効果が見えにくいわけで・・・。)

で、タイミングを見計らっていたわけですが、最初の契機として、上記のLaravel5.5がPHP7ベースであること、また、2017年10月8日にPHPカンファレンスでPHP7へのアップグレードの苦労話をしてくれる(しかも無料で!スピーカーはGMOペパボのエンジニア)というので行ってきまして、結局はそれがきっかけになりました。

<アップグレードのステップ>

PHPカンファレンスでGetした情報として、php7ccをcomposerでインストール(参考:PHP7の互換性チェック)するところから始まります。
チェックするだけならコストも時間もかからないということで、ちょっと手が空いた隙に、さっとGitでBranchを作りました。とにかく、その瞬間に少しやろうとしたモチベーションを無駄にしないように考えました。笑
そして、composerでphp7ccをインストール。さっと1ファイルをチェックしてみました。
すると想定に反して、「エラー無し!」これで、随分とやる気が出てきました!!!

「この機を逃すな」、と自らに言い聞かせ、、、進めます。

普段、ローカル開発環境をVagrantで構築しているのですが、最新の環境を急いでVagrant Box化しました。
Vagrantのpackageは時間がかかるので、早く・・・と焦りながら(こっちは、いつ自分のモチベーションが落ちないかと、心配です。笑)しばらく待ちつつ、ソースを別ディレクトリに全コピー。

新しいディレクトリでVagrant initで新しいBoxを指定して実行!これで、新しい環境の出来上がりです。
早速、新環境で、PHP5.6を削除し、PHP7.0をインストール。

いっそ、7.1に行こうか迷いましたが、7.1はまだリリースから1年経っていないので、と思いつつ試しに、yum installでremiリポジトリからインストールを試そうとすると、php71を指定しているのに、php56の表記。これでいいですか?と表示される。(なぜ?)困惑しつつも迷わず、"N"を選択。「これはまだやるなということなのだろう」と解釈。

これで腹は決まりました。
取り急ぎ、7.0へ。新しすぎる機能は色々苦労することが多いので、何れにしても7.0の方が良さそうと言い聞かせました。実際、新しい環境ではなんどもしなくていい苦労をしました。例えば、出たばかりのWindows10上で環境構築をした時とか、、、もう思い出したくもありません。あの時は辛かった。書きたいのにコード書くところまでいけない、、、Vagrantが立ち上がらない、一個一個バージョンを戻して、、、ようやくたどり着くという悪夢でした。PCをMacに変えてからは、もうそんな状況が一切なくなりました。
そんな過去の事例を思い出しつつ、、、とりあえず、今はPHPメジャーバージョンアップの壁を乗りこえることだ、と考えた次第です。

こういう時に、環境構築がchefなどでコード化できていないことの痛みを思い出しますよね・・・。
でも、「インフラのコード化がユーザにもたらすメリットをまだ論理的に説明できないので後回しだ」と言い聞かせ、これまたどこかでやりたいと思いつつ、今はとりあえず手順を記載してインストール作業を強行。php.iniの設定をし、サーバーの再起動。

そして、期待しつつ、半信半疑で、トップ画面へアクセスすると、、、エラー発生。。。
やっぱりそんなに甘くないか。

見ると、外部から取得したソースの中で、PHP7.0に対応できていないコードがあるとのこと。
ここで、また、php7ccでチェック。何箇所かエラーが出てきましたが、ほぼすべてがコンストラクターの記述の部分でした。(PHP 7はPHP 4形式のコンストラクターのみが定義されている場合、 E_DEPRECATEDエラーを発生させる。とのこと)
慎重に1ディレクトリずつ、php7ccでチェック=>エラー修正を繰り返し。

元々、ゼロから書いたソースは、5.6ベースだからか、ほぼエラーはありませんでした。外部から取得したり買ったソースなどでは、かなり引っかかり、あー、このソースってこんなに古い時に作られたものなんだ、と思いつつ、いらないものを捨て、いるものを書き換えるを繰り返し。

でも、結果的にphp7ccのおかげで結構簡単に進められました!(PHPカンファレンスで聞いておいてよかったです)

全部直して、再起動。問題なく、起動できました!
最後にPHP Unitでテストを流し、無事通過。思ったよりかなり順調!

そして、一つの画面で速度を検証してみると、なんと、約30%速度改善、メモリが1/3 !
やってよかった!
2〜3日かかるかも・・・と思ってましたが、3~4時間ほどでとりあえず、クリアできました。これは嬉しい。

本番環境もAWS EC2のイメージ作成=> 別インスタンス作成・起動=>PHP7.0インストール、ソースをアップデートし、動作チェック=>問題無し。あぁ、PaaSってなんて便利なんだとこういう時につくづく思います。失敗すれば捨てればいいですから。
いずれこの辺りもDocker化して、開発環境で解決できるようにしたいな、、、と思いつつ、今は必要最低限の時間で最適な事をやっていかないといけないので、諦めました。いずれ、それの必要性がくる時があると思うので、その時にきっちりやってしまうことに。こうやって、やりたいこととやるべきことを決めていくのが、多少の苦痛ですよね。

しばらく、テスト環境でバッチ処理などの動作確認の上、本番反映。ただ、しばらくはいつでも戻れるよう、PHP5.6用のBranchも残しつつ、やっていくことにします。少々面倒ですが。

アドサイクルは、新しい環境をキャッチアップし、より高速な稼働で、より速い開発を可能にし、順番待ちをしている機能強化に努めてまいります!​
2017/11/13 12:00
村上 和也

村上 和也

株式会社エフォートサイエンスの代表。
新卒でエンジニア、その後、インターネットの広告代理店へ入社し、約10年ほど運用型広告の運用管理、仕組みづくり、R&Dの業務経験などを経て、2016年より独立・起業。元運用者として、主に「アドサイクル」の開発を設計、企画、開発、販売を行う業務に従事。

「アドサイクル」開発ブログ 〜運用型広告のクリエイティブ改善を〜

「アドサイクル」開発ブログ 〜運用型広告のクリエイティブ改善を〜

広告クエリエイティブ改善ツール「アドサイクル」を開発している視点から、様々な気づきや想いを記載しております。なぜアドサイクルが生まれたのか、なぜ進化を続けようとするのか、なぜアドサイクルなのかなどを少しでもお伝えできれば幸いです。