OPCache preloadの話 / opcache_preload

OPCache preloadの話 / opcache_preload

OPCache preloadの解説

F04982ad61107b5408ad139966596316?s=128

Ryo Tomidokoro

February 26, 2020
Tweet

Transcript

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

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

  3. OPCache preload とは?

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

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

  6. OPCacheのおさらい

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

  8. 例えば

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

  10. None
  11. None
  12. None
  13. 具体例1

  14. ファイル構成

  15. index.php

  16. autoload.php

  17. A.php

  18. B.php

  19. 実行すると

  20. 実行の流れ

  21. 4回のコンパイル

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

  23. preloadが達成すること

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

  25. 具体例2

  26. ファイル構成

  27. preload.php

  28. php.ini

  29. 実行すると

  30. 実行の流れ

  31. 3回のコンパイル

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

  33. PHPソース v7.4.3

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

    persistent_compile_file。これはpreloadの有無に依らない
  35. Zend/zend_execute_API.c - L1419 zend_fetch_class_by_name が未解決のクラス名 に対してコールされる - zend_hash_findでコンパイル済みのクラスが発見されれ ば、それを使う(preload) -

    それ以外は、autoloaderを使ってクラスの解決が行われて、 ファイルが見つかればコンパイルされる
  36. preloadの現状

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

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

  39. 開発時の注意

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

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

  42. まとめ

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