Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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有無で若干変わる ● 本番投入は、まだ待ったほうが...