カテゴリ: PHP
記事投稿日: 2017年4月17日
PHPの正規表現のパターンマッチ数には、上限があり、ローカルの nginx は 1,000,000 だが、Heroku はそれより少ない(おそらく 100,000) のため、例外が発生した
* PHP 5.2.0 から、通常は、 pcre.backtrack_limit を超えるマッチができない
* pcre.backtrack_limit は、PCRE(Perl Compatible Regular Expression:正規表現エンジン)のバックトラックリミット
* デフォルトの制限値は 1,000,000( PHP < 5.3.7 ではデフォルトが 100,000)。
* phpinfo() で pcre.backtrack_limit を検索する
* echo ini_get(‘pcre.backtrack_limit’); で出力する
* preg_match : マッチしない時の「0」が返る
* preg_replace: NULL が返る
* php.ini を直接編集する場合 → 「memory_limit」の下に「pcre.backtrack_limit = 200000」を追加
* ini_set を使う場合 → ini_set(‘pcre.backtrack_limit’, 1000000);
【php】正規表現ってそんなに負荷が高いの?(その3)
https://www.softel.co.jp/blogs/tech/archives/908
【PHP】preg_match関数が動かない原因は「pcre.backtrack_limit」
http://ysklog.net/php/1340.html
[セキュリティ]マッチするはずの正規表現がマッチしない現象
http://d.hatena.ne.jp/teracc/touch/20100410/1270885661 ※リンク切れ
正規表現のパフォーマンスの話をされても全くピンと来なかった僕は、backtrackに出会いました。
http://qiita.com/mochizukikotaro/items/d36e61e56220da5f95d1
正規表現は便利ですが、できるだけ「長く」「詳細に」書くことが大切なんだなと思いました。
サーバを移管して、プログラムが動かなくなる時のチェック事項としても知見を得ることができました。
コメントを残す