Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OPCache preloadの話 / opcache_preload
Search
Ryo Tomidokoro
February 26, 2020
Programming
3
270
OPCache preloadの話 / opcache_preload
OPCache preloadの解説
Ryo Tomidokoro
February 26, 2020
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
52
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
1.8k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
46k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.7k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.8k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.9k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.1k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
13k
Other Decks in Programming
See All in Programming
Honoとフロントエンドの 型安全性について
yodaka
7
1.3k
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
Introduction to kotlinx.rpc
arawn
0
710
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
130
Ruby on cygwin 2025-02
fd0
0
150
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
130
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
570
技術を根付かせる / How to make technology take root
kubode
1
250
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
130
SpringBoot3.4の構造化ログ #kanjava
irof
3
1k
楽しく向き合う例外対応
okutsu
0
220
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
450
Unsuck your backbone
ammeep
669
57k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Raft: Consensus for Rubyists
vanstee
137
6.8k
The Language of Interfaces
destraynor
156
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
Designing for Performance
lara
604
68k
Transcript
@hanhan1978 OPCache preloadの話 PHP勉強会 2020/2/26
本日のテーマ OPCache preloadを完全に 理解する。
OPCache preload とは?
PHP7.4から追加 https://wiki.php.net/rfc/preload
• OPCacheの設定項目 • 実行速度が速くなる
OPCacheのおさらい
PHPはスクリプト言語 • 実行時にコンパイル • コンパイル&実行を繰返す
例えば
PHPスクリプト実行の流れ
None
None
None
具体例1
ファイル構成
index.php
autoload.php
A.php
B.php
実行すると
実行の流れ
4回のコンパイル
• compile結果はキャッシュさ れる • 次回はキャッシュが使われる ので実行が早い
preloadが達成すること
• SAPI起動時にキャッシュ • 最初からコンパイル済みの状 態になる
具体例2
ファイル構成
preload.php
php.ini
実行すると
実行の流れ
3回のコンパイル
• autoloadが省略される • preload以外のファイルは opcache.validate_timestamp=0と 同じ挙動 • 直接のrequireはpreloadが活用さ れない
PHPソース v7.4.3
ext/opcache/ZendAccelarator.c - SAPI起動時に L4200 preload_load() - globalなデータ領域にpreloadしたクラス、ファイルの情報を登 録する - opcodes実行時のコンパイルに使われるのは、L1914
persistent_compile_file。これはpreloadの有無に依らない
Zend/zend_execute_API.c - L1419 zend_fetch_class_by_name が未解決のクラス名 に対してコールされる - zend_hash_findでコンパイル済みのクラスが発見されれ ば、それを使う(preload) -
それ以外は、autoloaderを使ってクラスの解決が行われて、 ファイルが見つかればコンパイルされる
preloadの現状
• 7.4.2でWindowsが対象外に • 内部クラス等、一部のケースでpreload が動作しない 7.4.3で修正? • opcache.preload_userの設定があっ ても一般ユーザでの起動時にsegfault ->
7.4.3で修正?
• https://bugs.php.net/search.php?cmd=displa y&package_name[]=opcache • redditのPHP系板 -> つい最近も7.4.3で Laravelが動いたなどの感動のお便りが報告さ れた 情報キャッチアップ
開発時の注意
• 内部の実行パスが少し変わるので、開 発(preload無)、本番(preload有)みた いな使い分けは危険 • 最低でも、phpunitはpreload有で実行 する • 出来れば、ファイル更新でphp-fpm再 起動とかが良さそう
phpunitで使うには これを設定しないと、コマンドライン実行時に opcacheが動かない。 preload専用の検証環境を用意してE2Eテストをし たとしても、エッジケースで動かない可能性もある ので、C1を通しでpreload設定で動かすようにしな いと怖い。
まとめ
• preloadはautoloadを削減 • ソースレベルでの実行パスが preload有無で若干変わる • 本番投入は、まだ待ったほうが...