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
PCREとPCRE-JITとPHP / pcre-pcre-jit-and-php
Search
Ryo Tomidokoro
May 29, 2019
Technology
3.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PCREとPCRE-JITとPHP / pcre-pcre-jit-and-php
PHPのPCREについて、基本的なこと
Ryo Tomidokoro
May 29, 2019
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
2.2k
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
1.7k
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.8k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.9k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
300
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.9k
集中して作業する技術/how_to_work_deeply
hanhan1978
69
61k
Other Decks in Technology
See All in Technology
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
190
AIで仕事のやり方を変える
matsu7874
1
400
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
620
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
2
1.2k
AIエージェントを雇う前に決める5つのこと
knishioka
1
160
DINO-EdgeQuery:Edge-First Polygon Decoding for Building Footprint Extraction from Satellite Imagery
lehupa
0
140
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
230
その指示、Bobにしっかり伝わってる?初心者でも即実践できる プロンプト/コンテキスト設計のコツ
muehara
1
140
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
130
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
240
Azure Cost Management の FOCUS コストデータを迷わず読むための“3つの軸”
tetsuyaooooo
0
140
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
2
2.2k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
570
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Writing Fast Ruby
sferik
630
63k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
AI: The stuff that nobody shows you
jnunemaker
PRO
9
970
Test your architecture with Archunit
thirion
2
2.4k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
The untapped power of vector embeddings
frankvandijk
2
1.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Transcript
PCREとPCRE-JITとPHPの話 Ryo Tomidokoro PHP Study 2019/05/29 @hanhan1978
そもそも何の話か?
preg_… の関数群 [引用] PHP PCRE - Manual https://www.php.net/manual/en/book.pcre.php
正規表現を使っている例
preg系関数群の正規表現の処理で使われている ライブラリ(PCRE)について、特に運用時に気に なる設定とか、パフォーマンスに関係する部分 について話します。 ※書き方とか文法の話はしません。
PCREとは?
Perl Compatible Regular Expression Perl互換正規表現
と言われても、ピンと来ない人が多いと思うの で、とても簡単な正規表現の説明 ※詳しくは英語版wikipediaを読むと分かりやすい。日本語でも大体OK
50's - 形式言語の研究過程でスティーヴン・クリーネが文 字群の数学的表記を記述 60's - ケン・トンプソンがQEDエディタに文字列のパター ンマッチ方法として導入 その後 -
edエディタや、grepへ同様機能が実装され、正規 表現として認知されていった。 ざっくりとした歴史
Basic Regular Expression 正規表現の種類 Extended Regular Expression GNU Emacs Regular
Expression sed, awk, grep の正規表現 | + ? などの表現が追加 PHPではereg_系の関数で使われる正規表現 (現在は非推奨) \w \b などの特殊文字列表現が使える
正規表現の種類 Perl Compatible Regular Expression Lazy match (非欲張り量指定子)などの強力で柔 軟な表現力が加わった 正規表現におけるデファクトスタンダードのよう
な存在
非欲張り量指定子 Non GreedyとかLazyとか言われる <span>hoge</span> 正規表現は基本欲張 <.+> <span>hoge</span> 非欲張り量指定子なら <.+?> <span>hoge</span>
で、PCREとは?
Perl互換正規表現ライブラリのnative実装。 独自のAPIとPOSIX準拠のAPIの両方がある。 BSDライセンスで公開されていて、様々な言語に 取り入れられている。
[引用] https://www.pcre.org/
PCRE-JITとは?
Just In Time Compiler 正規表現のパターンマッチの速度を上げる目的で導入され た正規表現のJITコンパイラ 通常の正規表現実行前に、JIT最適化を行うためCPUに余分 な負荷をかけるが、正規表現マッチングのパフォーマンス が上がる。
正規表現ライブラリのベンチマーク [引用] 正規表現技術入門 - 新屋良磨、鈴木勇介、高田謙 技術評論社 (p99)
正規表現の最適化を行う分、プロセッサに余計 な負荷をかけるが、正規表現のパターンマッチ 実行時間を大幅に軽減できる。 特殊な理由が無い限りPCRE-JITの利用が望まし い。
PHPとPCRE
PCREとPCRE-JITの歴史 1997-9-10 ver 0.91 -> PCREのもっとも古いchangelogの日付 . . . 2011-10-21
ver 8.20 -> PCRE-JITがリリース 2015-1-05 ver 10.00 -> PCRE2がリリース このリリース以降、PCREはバグフィックスのみ。 PCRE-JITもPCRE2-JITとバージョンに合わせた名前に変更 ※重要 PCRE2-JITにおいて、APIに若干の変更がある [引用] https://www.pcre.org/original/changelog.txt
PHPとPCRE-JITの歴史 PCREはPHP4系から存在していたようなので馴れ初めは割愛 [2015-12-03] PHP7のリリース、pcre.jit=1 がデフォルト設定に。 [2017-11-30] PHP7.2 Support for PCRE
JIT Fast Path -> pcre_jit_exec [2018-12-06] PHP7.3のリリース PCREからPCRE2にライブラリが変更 [引用] https://www.php.net/releases/
PHPとPCREの関係 PHPのソースコード内に丸っとPCREのソースコードが同梱さ れている。
PHP7.2系
PHP7.3系
実際にベンチマークしてみる
PHP7以降はpcre.jitが有効
pcre.jit最強? 実行時間を考えるとpcre.jitを有効化すべきだが、場合に よっては有効化できない場合がある。 PHP5系において、コンパイル後の正規表現の実行スタック サイズが64Kを超えてしまう場合、pcre.jitでエラーが発生 する。PREG_JIT_STACKLIMIT_ERROR
PREG_JIT_STACKLIMIT_ERRORの解決策として pcre.jit を0に設定するという対策があるがオススメ はしない。 先程みたとおり、jitコンパイラで最適化された正規表 現はとにかく速い。
JIT無効でベンチマークしてみる
pcre2の性能差で7.3系はjit無効化しても多少性能が良い
pcre.jitを無効化する場合は、その代償をよく 考えた上で無効化すること せめてPHP7.3系に上げることで、JIT無効化環境 でもPHP5系よりも速いパフォーマンスを手に入 れることは可能。
ところで
64Kを突破したくないですか?
JITのStack Sizeはmin 32K [引用] https://www.pcre.org/original/doc/html/pcrejit.html
もう少しよく読むと...
最大値は任意に指定できる [引用] https://www.pcre.org/original/doc/html/pcrejit.html
PCRE2も同様
Stackサイズ表 PHPバージョン PCRE-JITスタックサイズ 7.0系 32K ~ 64K 7.1系 32K ~
64K 7.2系 32K ~ 64K 7.3系 32K ~ 192K 7.3系で PCRE_JIT_STACK_MAX_SIZE が変更になっていた
エラー内容とその対応 注)良い子は真似しちゃ駄目な対応が含まれます。
1. PHP7.3系にあげてみる 2. 複雑な正規表現を改善する 3. スタックサイズを上げる ext/pcre/php_pcre.c #define PCRE_JIT_STACK_MAX_SIZE (192
* 1024) を書き換えてコンパイル PREG_JIT_STACKLIMIT_ERROR
1. PCREのコンパイルオプションを変える ext/pcre/pcre2lib/config.h #define LINK_SIZE 2 これを4とかにする。64K -> 128K までコンパイル済み正
規表現のサイズが上がる。 Compilation failed: regular expression is too large
まとめ PHP7.3系からPCRE2に変更 PHP7.3系はStackサイズがちょっと大きい pcre.jit=0はパフォーマンスが悪い 最終手段は再コンパイル!