记一次PHP7中正则匹配失败,原因为PREG_JIT_STACKLIMIT_ERROR

最近弄了一台机器,安装php7,性能很棒!

但是在运行中发现之前的程序运行有些异常,有些正则匹配不到了,开始怀疑是正则表达式的问题,一番查找发现php7并没有对正则进行改动。接下来就是一番痛苦的查找bug,我甚至写了一个非正则的函数来替换原来的正则匹配,不过太消耗cpu而放弃了。

还是继续找bug,打印出正则的错误信息

echo array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];

出现了 PREG_JIT_STACKLIMIT_ERROR

官方给出的提示是:

  • PREG_JIT_STACKLIMIT_ERROR (自 PHP 7.0.0 起)
PREG_JIT_STACKLIMIT_ERROR 当 PCRE 函数因 JIT 栈空间限制而失败, preg_last_error() 就会返回此常量。

果然是php7中引入的特性引起的!

在php7.1中,我们没办法改变jit的栈空间,当字符串太大的时候,栈空间满了,直接就出错了。

解决方案

打开php.ini,找到pcre.jit=1这行,改成pcre.jit=0,不使用jit

 

赞赏

微信赞赏支付宝赞赏

发表评论

您的电子邮箱地址不会被公开。