记一次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

 

你可能还喜欢下面这些文章

一个功能完备的url路由:Hcrail

写在前面功能完备还有待添加,嘿嘿正文之前学习了一下composer,正好也缺一个很优雅的 url 路由,于是就来实践一下,这个路由需要php 5.3以上环境支持,因为用到了匿名回调。代码<?phpnamespace cmhc\Hcrail;class Hcrail{    /**     * callback function     * @var callable     */    protected static $callback;    /**     * match string or match regexp     * @var string     */    prot

c++ 标准库二分查找

C++标准库中的二分查找可以通过和函数实现。这两个函数都在头文件中定义,并接受一个排序的范围(例如,,,等)以及一个要查找的值。返回指向在范围中第一个不小于(即大于或等于)给定值的元素的迭代器。则返回指向在范围中第一个大于给定值的元素的迭代器。下面是一个使用进行二分查找的例子:在这个例子中,我们首先定义了一个排序的,然后定义了一个目标值。我们使用查找,然后检查返回的迭代器是否指向。如果是,我们就打印出在中的位置。否则,我们打印出未找到的消息。如果你想查找的是范围中是否包含特定的值,并且不关心具体的位置,你可以将和的结果进行比较。如果它们相同,那么范围中不包含该值。否则,范围中包含该值。请注意,

C++实现python字符串的endswith方法

可以使用的或方法配合比较运算符来模拟方法的功能。下面是一个示例函数,它检查一个字符串是否以另一个字符串结束:在这个示例中,函数接受两个参数:和。函数首先检查的长度是否大于或等于的长度。如果不是,那么显然不能以结束,函数返回。否则,函数使用方法从的末尾提取与长度相同的子字符串,并将其与进行比较。如果它们相等,那么以结束,函数返回。否则,函数返回。请注意,这个函数是区分大小写的。如果你想要一个不区分大小写的版本,你可以在比较之前使用和函数将和转换为小写。在这个版本中,函数首先使用和函数将和转换为小写。然后,它调用函数来检查转换后的字符串是否以结束。

Go入门:六、常用标准库

这是我的Go学习的第六篇笔记,也是Go入门的最后一篇笔记。在大多数语言中,了解了变量和数据类型,流程控制,函数,面向对象,再加上标准库,就可以用这门语言去写一些项目了。首先让我想想,在工作中通常会用语言频繁处理什么问题或者处理什么数据?最常见的应该是各种字符串操作,日期和时间,读写文件、socket等IO相关的操作!字符串处理 — StringsString提供了一组处理字符串的操作,常用的有:判断一个字符串是否在另一个字符串中分割字符串为[]string和组合[]string为一个字符串字符串替换...太多了,就不一一列举了,这里列出一些常用的字符串操作。字符串判断字符串分割与合并字符串转换

Go入门:三、函数的声明和调用

这是我Go学习笔记的第三篇!接下来学习的是Go的函数声明和调用。我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库函数声明func 函数名称(参数表) 返回值类型 { // 函数体}写一个函数是非常简单的,掌握语法格式就可以了。函数是一个功能的封装,能让函数体内的代码得到很好的复用。比如我要输出个人信息,我可以把个人信息封装到函数里面,后续直接调用这个函数而不是每次都print一堆信息了上面定义的函数没有参数,也没有返回值,非常简单的一个函数。如果我想让姓名可变,那么可以定义一个带有参数的函数接下来定义一个有

Go语言的 make 和 new

new 和 make 是两个内置函数,主要用来创建并分配类型的内存。在我们定义变量的时候,可能会觉得有点迷惑,不知道应该使用哪个函数来声明变量,其实他们的规则很简单,new 只分配内存,make 只能用于 slice、map 和 channel 的初始化。下面我们就来具体介绍一下new在Go语言中,new 函数描述如下:从上面的代码可以看出,new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。同时 new 函数会把分配的内存置为零,也就是类型的零值。【示例】使用 new 函数为变量分配内存空间。当然,new 函数不仅仅能够为系统默认的数据类型,分配空间,自定义

C++入门:三、函数

这是我学习C++的第三篇笔记,函数。我的学习路径是现在学习的是函数的声明、定义、调用等相关知识。函数声明和定义函数的声明包含返回类型,函数名字,0个或者多个形参,无函数体,通常在头文件中对函数进行声明。函数的定义包含返回类型,函数名字,0个或多个形参,以及函数体。比如写一个求阶乘的函数,可以写成下面这样写一些简单的函数大多数语言都差不多,不过可惜每种语言或多或少都有自己的特色,这是比较令人头秃的地方。函数的参数函数可以带有0或多个参数,每个参数都需要声明类型。参数传递可以传值和传引用。如果形参是引用类型,那么它将绑定到对应的实参中,我们成为传引用。否则,将会把实参的值拷贝后赋值给形参,我们成为

mysq常用函数大全

很少用到,但是有时候又必须用到,这里收集一下mysql的常用函数一、数学函数ABS(x)   返回x的绝对值BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)   返回大于x的最小整数值EXP(x)   返回值e(自然对数的底)的x次方FLOOR(x)   返回小于x的最大整数值GREATEST(x1,x2,...,xn)返回集合中最大的值LEAST(x1,x2,...,xn)      返回集合中最小的值LN(x)                    返回x的自然对数LOG(x,y)返回x的以y为底的对数MOD(x,y)              

python学习笔记:三、函数

这是第三篇python学习笔记,我们即将要学习python的函数。内容主要包括两个部分,函数的声明和函数的调用。函数声明和调用比如我们要声明一个“吃”的函数,语法如下:def eat(): return "eat something"print(eat())上面是一个没有参数的函数,做的事情很简单,声明一个函数,然后返回一个字符串。接下来要增加一个参数了。def ead(food): return "eat %s" % foodprint(eat('fruit'))可以看到,上面声明了一个带有一个参数的函数,当然可以声明带两个,三个等。这些都是固定的,那么如果要声明一个不固定参数的

命令行下的mongo初试

从连接mongo开始,熟悉一下命令行下面的mongo使用连接普通连接mongo mongodb://ip:port查看数据库show dbs选择或者创建数据库use mydb创建一个集合比如创建一个mycollection的集合db.createCollection('mycollection')显示数据库中所有的集合show collections向集合中写入数据假设我们创建了一个mycollection集合,实际上当我们没有创建mycollection集合的时候,执行下面的命令mongo会自动创建一个mycollection集合db.mycollection.insert({"foo",'

赞赏

微信赞赏支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注