【PHP】preg_match関数が動かない原因は「pcre.backtrack_limit」

公開日:
更新日:
カテゴリー: PHP

自作したプログラムを、さくらインターネットからエックスサーバーに移し、テストしたところ動きませんでした。そのため再度さくらインターネットに移し、テストしたところ正常に動きました。

は?なんで??と原因が分からず、数時間プログラムをあれこれ触った結果、preg_match関数のところで処理が止まっていることに気づきました。

しかし何もおかしなところがないため、復旧の方法がわからず、いらいらがピークに。その瞬間ひらめきました。

pcre.backtrack_limitの制限値を超えていた

原因は、preg_match関数に処理させるデータ量が大きすぎて、「pcre.backtrack_limit」値を大きく超えていることでした。

なお、「pcre.backtrack_limit」は読んで字のごとく、PCRE(Perl Compatible Regular Expression:正規表現エンジン)のバックトラックリミットです。

PHP5.2.0から導入されたもので、デフォルトの制限値は100000です。

確認していませんが、おそらく100000バイトのデータを超えるものをpreg_match関数に渡すと「0」を返す、つまり動かなくなるようです。

pcre.backtrack_limitの制限値を上げる

原因がわかったらあとは簡単です。「pcre.backtrack_limit」値をphp.ini編集で上げるだけです。

デフォルトでは100000となっているので、単純に2倍程度(ここは適宜)でいいんじゃないか?と思いphp.iniの編集で「pcre.backtrack_limit = 200000」を追加しました。

php.iniの編集方法

php.iniの編集方法は検索するとゴロゴロ出てくると思いますので省略します。

私はエックスサーバーでphp.iniの編集を行ったので、その方法だけメモします。

エックスサーバーにログイン

サーバーパネル

設定対象ドメインをプログラムを走らせるドメインに設定

php.ini設定

php.ini直接編集

「memory_limit」の下に「pcre.backtrack_limit = 200000」を追加

保存

あとがき

お恥ずかしながら、なぜ「pcre.backtrack_limit」が原因だとわかったかというと、以前さくらインターネットで同じ現象で苦しんだんです(preg_match関数がうまく動かない)。

その数ヵ月後、エックスサーバーで同じ現象で悩んでいるので、バカの極みです。ちょっと自分の学習能力のなさというか、記憶力のなさに凹みます。

ちなみに上記リンク先に、さくらインターネットでのphp.ini編集方法をちょろっと書いているので、もしよければ参考にしてください。

 

頑張って書いたのでちょろっと読んでほしい!

 

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント