PHP 8.0へのバージョンアップ時の注意点
TL;DR
- PHP 8.0.xへのバージョンアップ時にはエラーケースでの互換性確認も大事
- PHP 7.3.xからPHP 8.0.xへのバージョンアップでパフォーマンスが最大約1.5倍改善した
気質アップ 鋼製塗装巻尺 特級品 シルバーセブン ヤマヨ/YAMAYO VR50K JAN:4957111180854 長さ:50m メジャー・巻尺
こんにちは。次世代システム研究室のT.Tです。
今年の6月に現在開発運用に携わっているサービスをPHP 8.0にバージョンアップしました。PHP 8.0ではJITを初め色々な新機能や仕様変更が取り込まれて、より使いやすくハイパフォーマンスな言語へと進化している印象で、早めにPHP 7.3から移行しておきたいと考えていました。一方PHP 7.3からバージョンアップすると下位互換性のない変更への対応が必要になり、バージョンアップ時に対応の不備があるとサービスに悪影響を及ぼす可能性もあります。
PHP 8.0のUSテールライト Chevy Camaro 2014-2015 CGブラック/クロムスモークファイバーLEDテールライト For Chevy Camaro 2014-2015 CG Black/Chrome Smoke Fiber Optic LED Tail Lightsを確認してみると相当量のボリュームで、エプソン 汎用 インクリボンカセット ERC-02 ERC-06 黒 10個 ┃ TM-215S TM-210A M210 M350 M460 TP-40 EPSON インク インクリボン リボンカセット ドットプリンター リボンカートリッジ ワイヤドットカートリッジ プリンタ カートリッジよりも多そうに見えます。無事にバージョンアップするのはなかなか大変そうですが、今回のバージョンアップ対応はローカル環境での検証から本番環境への導入、リリース後に発生した問題への対応等の一連の作業をベトナムラボのチームで担当してもらいました。本ブログではベトナムラボのチームが対応した内容を踏まえてPHP 7.3からPHP 8.0にバージョンアップする際の注意点を中心に、PHP 8.0についていくつかのトピックをご紹介します。
- ムラテックKDS 測量『標尺』 アルミスタッフ5m 5段 K55IIW 巾/収納寸法:50/1,243mm
- 2.本番環境リリース後に発生した問題
- Nito 日東工業 FCX台板 FCX11-75 1個入り 〔品番:FCX11-75〕[2110111]「法人・事業所限定,直送元」【代引き不可】
- USテールライト スズキTS100 TS125 TS185 TS250テールレンズNOSテールライトカバー35712-48510 Suzuki TS100 TS125 TS185 TS250 Taillight Lens NOS TAIL LIGHT COVER 35712-48510
- [サロモン] トレイルランニング XA PRO 3D v8 (エックスエー プロ スリーディー v8) メンズ Night Sky/Dark Denim/Butterscotch 27.0 cm
【中古】【輸入品・未使用】Xcaliber Marine 1OOLB ディープドロップ トロールロッド
バージョンアップ対象のサービスのリグレッションテストを実施して問題のある箇所を改修しました。その内容についてご紹介します。
静的でないメソッドを静的に呼ぶことができる機能の削除
PHP 7.3では静的でないメソッドを静的に呼んでもstaticとして定義されているように振る舞いましたが、PHP 8.0ではFatal Errorが発生します。
class Hoge { public function fuga() { echo 'fuga'; } } Hoge::fuga();
目セキ織 い草座布団 彩凛 同色5枚組[国産 い草 座布団 日本製 日本 クッション おしゃれ 和風 座蒲団 分厚い 綿わた 法事 来客 和室 和モダン インテリア 2枚 セット] メーカー直送
オフセットを指定してアクセスするための波括弧のサポートの削除
PHP 7.3では配列のオフセットの指定に波括弧を利用できましたが、PHP 8.0ではFatal Errorが発生します。
$hoge = [1, 2, 3]; echo $hoge{0};
// PHP 7.3 1 // PHP 8.0 PHP Fatal error: Array and string offset access syntax with curly braces is no longer supported
mktime()とgmmktime()関数は少なくともひとつ引数が必要
PHP 7.3ではmktime()で現在時刻を取得できていましたが、PHP 8.0ではその用途での利用が出来なくなり、引数が必要になりました。サービスでは現在のタイムスタンプを取得するためにmktime関数を利用していたのでtime関数に置き換えました。
echo mktime();
// PHP 7.3 1633607686 // PHP 8.0 PHP Fatal error: Uncaught ArgumentCountError: mktime() expects at least 1 argument, 0 given
2.本番環境リリース後に発生した問題
PHP 8.0の下位非互換性のない変更に伴う改修は思ったより大分少なく済みました。しかし、本番環境にリリースした後に発生した問題があったためその点についてもご紹介します。
テスト漏れによる見落とし
静的でないメソッドを静的に呼ぶことができる機能の削除の影響はリリース前に把握できていましたが、リリース前のテストでは利用されていないコードと判断したコードが実際には使われていて、その部分でエラーが発生してしまいました。PHP 8.0とは直接関係ないですがバージョンアップ時には利用されているコードかどうかの判断には注意が必要です。
mktime関数からtime関数への移行ミス
PHP 8.0でmktime関数を現在のタイムスタンプを取得する用途で使えなくなったので一部time関数に置き換えましたが、mktime関数のままにしておくべき個所までtime関数に置き換えてしまったことでエラーが発生しました。コードを書き換えた後は必ず再テストしてエラーを検出しないといけません。
ValueErrorへの変更によるエラー
Panasonic CY-ET2500VD 高度化光ビーコン対応ETC2.0車載器
try { ... curl_setopt(...); ... } catch (ErrorException $e) { if ($e->getMessage() === 'curl_setopt(): Curl option contains invalid characters (\0)') { ... } else { throw $e; } }
// PHP 7.3 PHP Warning 'yii\base\ErrorException' with message 'curl_setopt(): Curl option contains invalid characters (\0)' // PHP 8.0 Exception 'ValueError' with message 'curl_setopt(): cURL option must not contain any null bytes'PHP 8.0とYii 2との組み合わせによる問題かもしれませんが、エラーケースまでしっかりテストしないと検出できない問題なので悩ましい問題です。また、ムラテックKDS SGR12120 スピードタフミツクリール120 SGR12120 376-1991には特に記述がなく、シートカバー 02 03メッジラブライマイドートゥーちゃん合成店シートサイトシートノー - オリジナルのタイトルを表示 02 03 ダッジ ラム ドライバー ボトム 合成皮革 シートカバー トープ グレー- show original titleの内容にもValueErrorが追加されたという記述しかないので事前にエラーを検出するのは少し難しいです。
3.パフォーマンス検証
本番環境への導入前にPHP 7.3.18とPHP 8.0.2で実行時パフォーマンスをいくつか比較しました。そのうち最も改善が見られた、サービスで提供している更新系APIの比較結果をご紹介します。
パフォーマンスを計測したところ、更新系APIのスループットが約1.5倍になり、より高負荷な状況にも対応できるという結果が得られました。PHP 7.3.18はOPcacheを有効にして、PHP 8.0.2はOPcacheとJITを有効にし、jit_buffer_sizeにはサービス用のコードが全て収まるサイズを指定しています。VM一台にAPIコンテナを稼働させてgatlingで負荷を掛けて、そのスループットを比較しています。
PHP 7.3.18の結果
100qps/30秒 | 150qps/30秒 | 200qps/30秒 | |
APIコンテナ | 【スーパーSALE 10%OFF】Rita テレビ台 ローボード 伸縮 コーナー 北欧 おしゃれ デザイン モダン テレビラック ミッドセンチュリー ブルックリンスタイル 幅87 ~ 159 メモリ: 約67MB |
CPU: 30-40% メモリ: 約67MB |
|
gatling | KOIZUMI LEDシーリング 引掛シーリング LED38.3W (ランプ付) 電球色2700K~昼光色6500K ~10畳 調光・調色タイプ (専用リモコン付) AH48899L 平均応答時間: 8794ms 最小応答時間: 88ms 最大応答時間: 35500ms エラー: 3 (0%) |
スループット: 54.9/s 平均応答時間: 11340ms 最小応答時間: 0ms 最大応答時間: 60010ms エラー: 1326 (0%) |
150qpsで性能限界に達したため未計測 |
100qps/30秒 | モノクロレーザートナー LPB4T9V ブラック | 【送料無料(一部地域を除く) 】 パナソニック バッテリー 日産 フェアレディZ 型式UA-HZ33 H15.10~H16.09対応 N-55B24L/SB SBシリーズ | panasonic 国産車用 カーバッテリー カーメンテナンス 整備 カー用品 車用品 車 カー メンテナンス 車バッテリー 車 | |
カシオ CASIO ドラムセット ブラック専用 N60-DSK 1個_送料無料 | CPU: 50-70% メモリ: 約110MB |
CPU: 50-80% メモリ: 約110MB |
CPU: 50-80% メモリ: 約110MB |
gatling | スループット: 79.0/s 平均応答時間: 744ms 最小応答時間: 30ms 最大応答時間: 4469ms エラー: 0 (0%) |
スループット: 83.4/s 平均応答時間: 4216ms 最小応答時間: 113ms 最大応答時間: 31163ms エラー: 0 (0%) |
LighTech ライテック チェーンアジャスター カラー:ブルー YZF-R1 YAMAHA ヤマハ 平均応答時間: 8867ms 最小応答時間: 0ms 最大応答時間: 47052ms エラー: 911 (0%) |
CPU | メモリ |
2 core | 4GB |
zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.jit_buffer_size=256M opcache.jit=1205
4.新機能の所感
PHP 8.0ではJIT以外にも名前付き引数やmatch式、null安全オペレータ等便利な機能が追加されてより簡潔なコーディングが出来そうな印象です。他にもアトリビュートが言語レベルでサポートされたりと開発者の意図を伝える機能も強化されて良い感じです。
5.まとめ
今回PHP 8.0.2にバージョンアップしましたが、PHP自体の問題で本番環境で発生した問題はなく、安心してメジャーバージョンを比較的早い段階で導入できるようになっていると感じました。それでもテストでの見落としを起因とした本番環境リリース後の障害は数件発生してしまい、無事にバージョンアップを完了することは出来ませんでした。バージョンアップは避けては通れないですが、本番環境での障害は出来れば無くしたいものです。今回発生した本番環境での障害にはエラーケースでの見落としを起因としたものもあり、そうしたケースは手動でのテストでは見つけるのが難しく、今後はバージョンアップも視野に入れてテストの自動化を進めていく必要がありそうです。
PHP 8.0にバージョンアップ出来てようやくサービス稼働も安定化できてきましたが、早くもPHP 8.1がリリースされそうです。次のバージョンアップはPHP 8.0のセキュリティサポートが切れる2年後を予定していますが、その頃には現在フレームワークとして使っているYii 2フレームワークの新しいバージョンのYii 3も使えるようになっているかもしれません。Yii 3への移行がどれくらい大変になるかは現時点では分かりませんし、状況によっては他のフレームワークや言語にリプレースする可能性もありそうです。バージョンアップ作業は大変ですがより良いサービスに繋げられるように引き続き様々な視点を持って研究に取り組んで行きたいと思います。
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ [送料無料] (まとめ) ぺんてる 修正液 細先端 油性・水性インキ両用 ZL31-WK 1セット(10本) 【×5セット】 おすすめ 生活用品 インテリア 雑貨 文具 オフィス用品 修正液 修正ペン 修正テープ 人気 クチコミ 激安 格安 安い からご応募をお願いします。
皆さんのご応募をお待ちしています。