Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ふるさと納税サイトをPHP8化した時の話.pdf

Kazuya
March 21, 2025

 ふるさと納税サイトをPHP8化した時の話.pdf

2012年に日本初のふるさと納税ポータルサイトとして立ち上がった「ふるさとチョイス」は、最後のリニューアルを2018年3月に行い、そこから開発・運用を続けてきました。

リニューアル当時はPHP7.4 + FuelPHP1.8.2で構築されていましたが、言語のEOLに伴ってこの度PHP8.3 + FuelPHP1.9-Dev へアップデートしましたため、
その時のつまづきポイントや苦労したところなどをお話させていただこうと思います。

PHPのバージョンアップはここ数年で実施している所も多く、目新しい構成や情報はそれほど多くないかもしれませんが、今後もアップデートを実施してく方の参考・助けになれば幸いです。

お持ち帰りポイント
・既存のリリースを止めずにバージョンアップを完遂させた方法と、想定通りに行かなかったポイント
・トラフィックの切り替え方法とその際の失敗パターン
・移行に伴って苦労したのはテンプレートエンジンでした(弊社はPHPTALを使用)

ふるさとチョイスの数字的特徴(2024年10月時点)
・PV:2億 / 月
・品の数:76万超
・利用自治体数:1700超
・決済種別:14種類

技術スタック
・PHP7.4
・FuelPHP1.8.2
・PHPTAL1.2.2
・MySQL5.6

ふるさとチョイス開発組織の特徴
・開発部門の人数: 80人
・リリースチケット件数:約25件/週

Kazuya

March 21, 2025
Tweet

Other Decks in Technology

Transcript

  1. SECTION 3 00 自己紹介 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知
  2. ふるさとチョイスの技術スタック 移行前 移行後 開発言語 PHP7.4 PHP8.3 FW FuelPHP 1.8.2 FuelPHP

    1.9-dev TemplateEngine PHPTAL1.2.2 PHPTAL1.2.2 DB MySQL5.6, 5.7 MySQL5.6, 5.7 OS CentOS7 AlmaLinux9
  3. 19 TimeLine 事前作業 機 能 取 り 込 み PHP8化対応

    リ ポ ジ ト リ 作 成 動作検証 リリース ソース凍結 PHP7 リポジトリ PHP8 リポジトリ PHP7開発中 ソース移行 取り込み + 動作検証 × α 開 発 中 の 機 能 移 行 機 能 取 り 込 み 機 能 取 り 込 み プロダクトの機能開発・リリース プロダクトの機能開発 ・リリース再開
  4. SECTION 20 03 事前作業 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知
  5. 21 TimeLine 機 能 取 り 込 み PHP8化対応 リ

    ポ ジ ト リ 作 成 動作検証 リリース ソース凍結 PHP7 リポジトリ PHP8 リポジトリ PHP7開発中 ソース移行 取り込み後 動作検証 × α 開 発 中 の 機 能 移 行 機 能 取 り 込 み 機 能 取 り 込 み プロダクトの機能開発・リリース プロダクトの機能開発 ・リリース再開 事前作業
  6. SECTION 31 04 PHP8化作業の主な内容 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知
  7. 32 TimeLine 機 能 取 り 込 み リ ポ

    ジ ト リ 作 成 リリース ソース凍結 PHP7 リポジトリ PHP8 リポジトリ PHP7開発中 ソース移行 取り込み後 動作検証 × α 開 発 中 の 機 能 移 行 機 能 取 り 込 み 機 能 取 り 込 み プロダクトの機能開発・リリース プロダクトの機能開発 ・リリース再開 事前作業 PHP8化対応 動作検証
  8. 34 strlen() PHP7.4までは 第1引数に nullが来ると falseを返していたが、 PHP8以降はerrorになる。 number_format() PHP 8.2

    から 第1引数に null を渡すとエラーになる 仕様変更でエラーになった関数達① str_replace() 第3引数に null を渡すとエラーになるようになってた explode() 第2引数にnullを渡すのは非推奨になった
  9. 35 strtotime() PHP7.4 までは第1引数に null が渡ると false が返されたが、PHP8.1 以降は非推奨エラーが発生するようになってた preg_match()

    PHP7.4 までは第2引数に null が渡ると 0 が返されたが、PHP8.1 以降は非推奨エラーが発生するようになってた 仕様変更でエラーになった関数達② mb_ereg_match() 第2引数に null がわたるとエラーになるようになっていた html_entity_decode() 第1引数に null が渡るとエラーになるように成っていた
  10. 39 TimeLine 機 能 取 り 込 み リ ポ

    ジ ト リ 作 成 リリース ソース凍結 PHP7 リポジトリ PHP8 リポジトリ PHP7開発中 ソース移行 開 発 中 の 機 能 移 行 機 能 取 り 込 み 機 能 取 り 込 み プロダクトの機能開発・リリース プロダクトの機能開発 ・リリース再開 事前作業 PHP8化対応 動作検証 取り込み後 動作検証 × α
  11. 41 • 実施したこと ◦ ひたすら git merge + conflict解消 +

    QA • ここで撒いた種が花開く ◦ PHP_CS_Fixerによってmerge時Conflict発生を抑止できた ◦ 関数毎の修正点をドキュメント化する事で取り込み担当者の属人化を 防げた • 結果 ◦ 週ごとの取り込みが約1時間程度で出来るようになりました!!
  12. SECTION 42 05 切り替え方法 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知
  13. 43 TimeLine 機 能 取 り 込 み リ ポ

    ジ ト リ 作 成 ソース凍結 PHP7 リポジトリ PHP8 リポジトリ PHP7開発中 ソース移行 開 発 中 の 機 能 移 行 機 能 取 り 込 み 機 能 取 り 込 み プロダクトの機能開発・リリース プロダクトの機能開発 ・リリース再開 事前作業 PHP8化対応 動作検証 取り込み後 動作検証 × α リリース
  14. DBサーバ 旧:新 = 75:25 リリース手順 現WEBサーバ 現APPサーバ 現WEBサーバ 現APPサーバ 新WEBサーバ

    新APPサーバ 新WEBサーバ 新APPサーバ 新サーバーに向けて LB→WEBサーバー の疎通開始 LBサーバ
  15. DBサーバ 旧:新 = 50:50 リリース手順 現WEBサーバ 現APPサーバ 現WEBサーバ 現APPサーバ 新WEBサーバ

    新APPサーバ 新WEBサーバ 新APPサーバ 新サーバーに向けて LB→WEBサーバー の疎通開始 LBサーバ
  16. DBサーバ 旧:新 = 25:75 リリース手順 現WEBサーバ 現APPサーバ 現WEBサーバ 現APPサーバ 新WEBサーバ

    新APPサーバ 新WEBサーバ 新APPサーバ 旧サーバーに向けて の接続を解除 LBサーバ
  17. DBサーバ 旧:新 = 0:100 リリース手順 現WEBサーバ 現APPサーバ 現WEBサーバ 現APPサーバ 新WEBサーバ

    新APPサーバ 新WEBサーバ 新APPサーバ 旧サーバーに向けて の接続を解除 LBサーバ
  18. 57 最終的には DBサーバ 現WEBサーバ 現APPサーバ 現WEBサーバ 現APPサーバ 新WEBサーバ 新APPサーバ 新WEBサーバ

    新APPサーバ ユーザーの動きが少ない時間帯 に新サーバーへ100%向け、 ユーザーの動きが多くなる時間 帯は旧サーバーへ戻す。 この作業を繰り返し新サーバー の稼働時間を長くしていく。 LBサーバ
  19. SECTION 59 06 まとめ 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知
  20. SECTION 62 07 最後は告知 0. 自己紹介 1. ふるさとチョイスの紹介 2. バージョンアップする際の前提条件と方針

    3. 事前作業 4. PHP8化作業の主な内容 5. 切り替え方法 6. まとめ 7. 最後は告知