ScarShow

< IS >

PHP 7 PREG_JIT_STACKLIMIT_ERROR

2017-01-14  /  IT  /  PHP Pointless

最近在重構學生時代的作品 Pointless 讓它符合現代的技術,順便熟悉一下 PHP7新的功能。

Pointless 中因為使用純文字的 markdown 格式來儲存文章所以有大量的機會會使用到 preg_* 相關的函式。

PHP7 其中的一個改變就是在 PCRE 中加入了 JIT 功能,可以用來優化正規表示式的效能,但是礙於 stack 的容量有限所以在處理長度較長的字串的時候,很容易就超過預設的 32K 的限制產生出 PREG_JIT_STACKLIMIT_ERROR

Solutions

當然解法可以直接將 JIT 關閉,當然這不建議。

在程式中

ini_set('pcre.jit', 0);

在 php-fpm 中

php_value[pcre.jit] = 0

另外一個解法則是去優化正規表示式,當然我採取直接關閉 JIT 的作法,當然這個作法並不好,但目前我應該不會去動表示式的部份,所以要立刻讓 Pointless 能在 PHP7 上正常運作就先這樣處裡。

詳細的建議可以去看看 Stackoverflow 上的解說連結在下面的 Reference 中。

Reference

PHP PREG_JIT_STACKLIMIT_ERROR - inefficient regex