Slide 1

Slide 1 text

@hanhan1978 OPCache preloadの話 PHP勉強会 2020/2/26

Slide 2

Slide 2 text

本日のテーマ OPCache preloadを完全に 理解する。

Slide 3

Slide 3 text

OPCache preload とは?

Slide 4

Slide 4 text

PHP7.4から追加 https://wiki.php.net/rfc/preload

Slide 5

Slide 5 text

● OPCacheの設定項目 ● 実行速度が速くなる

Slide 6

Slide 6 text

OPCacheのおさらい

Slide 7

Slide 7 text

PHPはスクリプト言語 ● 実行時にコンパイル ● コンパイル&実行を繰返す

Slide 8

Slide 8 text

例えば

Slide 9

Slide 9 text

PHPスクリプト実行の流れ

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

具体例1

Slide 14

Slide 14 text

ファイル構成

Slide 15

Slide 15 text

index.php

Slide 16

Slide 16 text

autoload.php

Slide 17

Slide 17 text

A.php

Slide 18

Slide 18 text

B.php

Slide 19

Slide 19 text

実行すると

Slide 20

Slide 20 text

実行の流れ

Slide 21

Slide 21 text

4回のコンパイル

Slide 22

Slide 22 text

● compile結果はキャッシュさ れる ● 次回はキャッシュが使われる ので実行が早い

Slide 23

Slide 23 text

preloadが達成すること

Slide 24

Slide 24 text

● SAPI起動時にキャッシュ ● 最初からコンパイル済みの状 態になる

Slide 25

Slide 25 text

具体例2

Slide 26

Slide 26 text

ファイル構成

Slide 27

Slide 27 text

preload.php

Slide 28

Slide 28 text

php.ini

Slide 29

Slide 29 text

実行すると

Slide 30

Slide 30 text

実行の流れ

Slide 31

Slide 31 text

3回のコンパイル

Slide 32

Slide 32 text

● autoloadが省略される ● preload以外のファイルは opcache.validate_timestamp=0と 同じ挙動 ● 直接のrequireはpreloadが活用さ れない

Slide 33

Slide 33 text

PHPソース v7.4.3

Slide 34

Slide 34 text

ext/opcache/ZendAccelarator.c - SAPI起動時に L4200 preload_load() - globalなデータ領域にpreloadしたクラス、ファイルの情報を登 録する - opcodes実行時のコンパイルに使われるのは、L1914 persistent_compile_file。これはpreloadの有無に依らない

Slide 35

Slide 35 text

Zend/zend_execute_API.c - L1419 zend_fetch_class_by_name が未解決のクラス名 に対してコールされる - zend_hash_findでコンパイル済みのクラスが発見されれ ば、それを使う(preload) - それ以外は、autoloaderを使ってクラスの解決が行われて、 ファイルが見つかればコンパイルされる

Slide 36

Slide 36 text

preloadの現状

Slide 37

Slide 37 text

● 7.4.2でWindowsが対象外に ● 内部クラス等、一部のケースでpreload が動作しない 7.4.3で修正? ● opcache.preload_userの設定があっ ても一般ユーザでの起動時にsegfault -> 7.4.3で修正?

Slide 38

Slide 38 text

● https://bugs.php.net/search.php?cmd=displa y&package_name[]=opcache ● redditのPHP系板 -> つい最近も7.4.3で Laravelが動いたなどの感動のお便りが報告さ れた 情報キャッチアップ

Slide 39

Slide 39 text

開発時の注意

Slide 40

Slide 40 text

● 内部の実行パスが少し変わるので、開 発(preload無)、本番(preload有)みた いな使い分けは危険 ● 最低でも、phpunitはpreload有で実行 する ● 出来れば、ファイル更新でphp-fpm再 起動とかが良さそう

Slide 41

Slide 41 text

phpunitで使うには これを設定しないと、コマンドライン実行時に opcacheが動かない。 preload専用の検証環境を用意してE2Eテストをし たとしても、エッジケースで動かない可能性もある ので、C1を通しでpreload設定で動かすようにしな いと怖い。

Slide 42

Slide 42 text

まとめ

Slide 43

Slide 43 text

● preloadはautoloadを削減 ● ソースレベルでの実行パスが preload有無で若干変わる ● 本番投入は、まだ待ったほうが...