邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php下正则匹配大字符串失败问题
问题描述:

在使用php函数preg_match匹配大字符串的时候匹配失败,而删除一半数据,则匹配成功,

解决过程:

于是在匹配结束后,调用preg_last_error()函数,查看失败原因,返回的是6,6对应的错误原因是PREG_JIT_STACKLIMIT_ERROR,

原来当字符串太大的时候,栈空间满了,直接就出错了,于是在匹配前加一下代码

ini_set('pcre.jit', 0);


解决查找的资料

1、深悉正则(pcre)最大回溯/递归限制(https://www.laruence.com/2010/06/08/1579.html)
关于php的JIT

关于php的JIT
php是解释执行的,它的编译过程是属于动态编译,也就是在运行的时候进行编译,与之相对的事运行前编译的静态编译。动态编译与静态编译除了编译时机的不同,还有一个不同之的地方,那就是静态编译是将代码编译成了机器指令,而动态编译并没有编译为机器指令,而是编译成了解释器可识别的指令。即时编译,即just-in-time complication,简称JIT。JIT是动态编译中的一种技术,简单的讲,就是在某段代码第一次执行前进行编译,所以称为即时编译。


与解释执行不同的事,JIT是将源代码编译为机器指令执行,但JIT又与静态编译不同,它是在运行时实时进行的编译,而且JIT并不会把所有代码全部编译为机器码,它只会编译频繁执行的代码。说JIT比解释快,其实说的是"执行编译后的代码"比"解释器解释执行"要快,并不是说编译比解释的过程快,而且JIT编译通常比解释执行要慢一些,如果对执行一次的代码进行即时编译,其效率反而要比解释执行慢,JIT之所以快是因为多次执行抵消了编译所占的世界,显得平均效果高而已。


优惠券
最新微语