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
1
2.9k
PCREとPCRE-JITとPHP / pcre-pcre-jit-and-php
PHPのPCREについて、基本的なこと
Ryo Tomidokoro
May 29, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
13k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
100
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
2.3k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
47k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.9k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.9k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
13
5.8k
Other Decks in Technology
See All in Technology
出前館を支えるJavaとKotlin
demaecan
0
150
SSH公開鍵認証による接続 / Connecting with SSH Public Key Authentication
kaityo256
PRO
2
280
AIエージェントの地上戦 〜開発計画と運用実践 / 2025/04/08 Findy W&Bミートアップ #19
smiyawaki0820
17
4.9k
「家族アルバム みてね」を支えるS3ライフサイクル戦略
fanglang
4
620
Webアプリを Lambdaで動かすまでに考えること / How to implement monolithic Lambda Web Application
_kensh
6
670
10分でわかるfreeeのQA
freee
1
11k
AIエージェント開発における「攻めの品質改善」と「守りの品質保証」 / 2024.04.09 GPU UNITE 新年会 2025
smiyawaki0820
0
290
2025年春に見直したい、リソース最適化の基本
sogaoh
PRO
0
410
NLP2025 参加報告会 / NLP2025
sansan_randd
4
330
テキスト解析で見る PyCon APAC 2025 セッション&スピーカートレンド分析
negi111111
0
260
モンテカルロ木探索のパフォーマンスを予測する Kaggleコンペ解説 〜生成AIによる未知のゲーム生成〜
rist
4
1.3k
Road to SRE NEXT@仙台 IVRyの組織の形とSLO運用の現状
abnoumaru
1
470
Featured
See All Featured
Docker and Python
trallard
44
3.3k
Rails Girls Zürich Keynote
gr2m
94
13k
Speed Design
sergeychernyshev
28
870
Bash Introduction
62gerente
611
210k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
Raft: Consensus for Rubyists
vanstee
137
6.9k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.5k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Optimizing for Happiness
mojombo
377
70k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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はパフォーマンスが悪い 最終手段は再コンパイル!