Slide 1

Slide 1 text

PHP 8.4がリリース! あなたはもうアップデートしましたか? pixiv Inc. 当田 昇(@picopico_dev) 2024.03.09

Slide 2

Slide 2 text

2 会社 ピクシブ株式会社 経歴 2023年4⽉ 新卒⼊社 職種 pixiv事業本部ウェブエンジニアリング部 兼 インフラ部SREチーム 当⽥ 昇 @picopico_dev

Slide 3

Slide 3 text

PHPのアップデート、してますか?

Slide 4

Slide 4 text

https://www.php.net/supported-versions.php

Slide 5

Slide 5 text

PHP8.0は既にEnd of life PHP8.1~8.2もSecurity fixes only

Slide 6

Slide 6 text

ところで・・・

Slide 7

Slide 7 text

2024/11/21にPHP8.4がリリースされました🎉

Slide 8

Slide 8 text

とはいえ、まだアップデートしていない人も多いはず ・・・

Slide 9

Slide 9 text

目次 1. PHPアップデートの全貌 2. PHP8.4移行の試練

Slide 10

Slide 10 text

目次 1. PHPアップデートの全貌 2. PHP8.4移行の試練

Slide 11

Slide 11 text

PHPアップデートの全貌 1. PHP8.4環境の作成

Slide 12

Slide 12 text

PHPアップデートの全貌 1. PHP8.4環境の作成 2. 自動化テストのパス

Slide 13

Slide 13 text

PHPアップデートの全貌 1. PHP8.4環境の作成 2. 自動化テストのパス 3. E2Eテスト or 主要な機能の動作確認

Slide 14

Slide 14 text

PHPアップデートの全貌 1. PHP8.4環境の作成 2. 自動化テストのパス 3. E2Eテスト or 主要な機能の動作確認 4. 段階的リリース

Slide 15

Slide 15 text

PHPアップデートの全貌 1. PHP8.4環境の作成 2. 自動化テストのパス 3. E2Eテスト or 主要な機能の動作確認 4. 段階的リリース 5. 100%リリース

Slide 16

Slide 16 text

目次 1. PHPアップデートの全貌 2. PHP8.3→8.4移行の試練

Slide 17

Slide 17 text

https://www.php.net/manual/ja/migration84.php

Slide 18

Slide 18 text

https://www.php.net/manual/ja/migration84.php

Slide 19

Slide 19 text

● exit() の動作の変更 ● 比較中の再帰 ● readonly プロパティの間接的な変更 ● 定数の型の変更 ● 一時ファイル名の長さ ● E_STRICT エラーレベルの削除 ● 型が追加された拡張クラスの定数 ● リソースからオブジェクトへの移行 ● 暗黙的な nullable パラメータ ● trigger_error() で E_USER_ERROR を使用 ● CURLOPT_BINARYTRANSFER 定数は非推奨 ● …

Slide 20

Slide 20 text

3つピックアップ!

Slide 21

Slide 21 text

その1: PECL拡張が対応してない そもそもPECL拡張が8.4に対応してない。 PRを送る or GitHubの最新対応版を自前でビルドして使う

Slide 22

Slide 22 text

その2: exitの関数化 何故かPHP8.4でテストを実行すると、テストが落ちても正常終了する問題

Slide 23

Slide 23 text

その2: exitの関数化 何故かPHP8.4でテストを実行すると、テストが落ちても正常終了する問題

Slide 24

Slide 24 text

その2: exitの関数化 CIでregister_shutdown_function()内でexit()を呼び出すコードがあった。 PHP8.4以前は終了コードが引き継がれていたが、PHP8.4以後はパラメータが無い時 にデフォルト値0が適用される。 よって、テストが落ちているのに何故か正常終了してしまっていた。

Slide 25

Slide 25 text

register_shutdown_function(function () { if (...) { exit(); // 終了コードが0になる破壊的変更 } }

Slide 26

Slide 26 text

その3: 暗黙的なnullable型の非推奨 デフォルト値null(=nullable)で型にnullが無い場合を非推奨に function foo(string $param = null) {}

Slide 27

Slide 27 text

Rectorで一掃する https://getrector.com/rule-detail/explicit-nullable-param-type-rector

Slide 28

Slide 28 text

ライブラリ側でエラーが発生したら? (以下は対症療法です。 出来ればPR送ってライブラリ側で修正するかフォークして下さい)

Slide 29

Slide 29 text

cweagans/composer-patchesでパッチを当てる https://docs.cweagans.net/composer-patches/

Slide 30

Slide 30 text

cweagans/composer-patchesでパッチを当てる 1. vendor/配下をgitに追加 2. vendor/配下にRectorを適用 3. git diff – vendor/hoge > patches/hoge-php84.patch 4. composer.jsonにパッチを追加

Slide 31

Slide 31 text

アップデート頑張ろう!