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

OPCache preloadの話 / opcache_preload

OPCache preloadの話 / opcache_preload

OPCache preloadの解説

Ryo Tomidokoro

February 26, 2020
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. OPCache preload
    とは?

    View Slide

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

    View Slide

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

    View Slide

  6. OPCacheのおさらい

    View Slide

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

    View Slide

  8. 例えば

    View Slide

  9. PHPスクリプト実行の流れ

    View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. 具体例1

    View Slide

  14. ファイル構成

    View Slide

  15. index.php

    View Slide

  16. autoload.php

    View Slide

  17. A.php

    View Slide

  18. B.php

    View Slide

  19. 実行すると

    View Slide

  20. 実行の流れ

    View Slide

  21. 4回のコンパイル

    View Slide

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

    View Slide

  23. preloadが達成すること

    View Slide

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

    View Slide

  25. 具体例2

    View Slide

  26. ファイル構成

    View Slide

  27. preload.php

    View Slide

  28. php.ini

    View Slide

  29. 実行すると

    View Slide

  30. 実行の流れ

    View Slide

  31. 3回のコンパイル

    View Slide

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

    View Slide

  33. PHPソース v7.4.3

    View Slide

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

    View Slide

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

    View Slide

  36. preloadの現状

    View Slide

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

    View Slide

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

    View Slide

  39. 開発時の注意

    View Slide

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

    View Slide

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

    View Slide

  42. まとめ

    View Slide

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

    View Slide