PHP 7中出现“分配JIT内存失败,PCRE JIT将被禁用”的警告

12

我正在将我的网站从安装在共享 Web 托管帐户(DreamHost)上的 PHP v.5 迁移到运行 PHP 7.3.11。迁移后,我开始注意到偶尔会收到这些警告:

警告:preg_match_all():JIT 内存分配失败,PCRE JIT 将被禁用。这可能是由于安全限制引起的。要么授予 PHP 分配可执行内存的权限,要么设置 pcre.jit=0

最后一个警告来自代码中的这一行,它应该替换页面上发布的 HTML 中的特殊标记:

if(preg_match_all("/\[".$tagBegin."(\S)+\]/U", $html, $matches, PREG_OFFSET_CAPTURE) !== false)
有没有在v.7.3中需要我做出不同的改变以避免这个警告?

1
这里有一个已经提交的错误报告(https://bugs.php.net/bug.php?id=78630)。我认为它与你的问题有关。 - Rain
2
PHP 没有 bug(虽然还有其他 PHP PCRE JIT 的 bug),但 @c00000fd 的问题不是 bug。PHP 尝试为 PCRE JIT 获取可执行内存,但被 Dreamhost 的配置阻止了(我认为是因为 /tmp 被挂载为 noexec,Dreamhost 似乎没有使用 SELinux,在任何情况下原因都不重要)。PHP 然后显示此消息,回退到非 JIT PCRE,并继续禁用 JIT 进行处理。这就是为什么此消息仅在某些时候出现,而页面则正常显示。解决方法是将 pcre.jit=0 放入 php.ini,请参见我在下面的评论中的说明。 - joelhardi
5个回答

12

您可以使用ini_set更改警告信息中建议的配置值来避免此警告。

ini_set("pcre.jit", "0");

确保在使用正则表达式之前运行该行代码。


以上都不对,应该是 ini_set('pcre.jit', '0'),因为两个参数都应该是 string 类型。 - Mike Doe
3
这只是一个不好的临时解决方法,无法解决实际问题。关键在于:“授予PHP权限分配可执行内存。” - hackel
5
我会慈善地重新表述你的评论,并加上一些猜测和假设:“这是一个不错的解决方法,但为了更好地提高正则表达式匹配的性能,最好授予PHP分配可执行内存的权限。这将允许JIT系统运行,而不是像这个解决方法那样简单地禁用正则表达式JIT编译。另一方面,保持JIT关闭可能存在安全方面的理由。考虑到共享主机环境,最终选择可能并不是你自己能够做出的!” - Alan H.
3
@hackel,您能否解释如何“授予PHP分配可执行内存的权限”? - Splambo
3
最近的PHP、systemd和selinux版本对像PHP(和php-fpm)这样的东西访问或动态分配系统资源施加了限制和安全阻止。为了生产目的,最安全的设置是在您的.ini配置文件中禁用它(pcre.jit=0),但是如果您想从selinux“解除阻止”:setsebool -P httpd_execmem on 参考:https://serverfault.com/questions/991549/grant-php-permission-to-allocate-executable-memory - Danang Ponorogo

4
  1. 在管理你的网站的任何系统中搜索:例如cPanel文件管理器网络托管商的管理面板你电脑上的硬盘,寻找名为“php.ini”的文件。在跟你的网站或应用程序有关的地方,不会有太多像这样的文件。

  2. 编辑php.ini文件,并找到部分[Pcre],并在该部分的底部添加以下行:pcre.jit=0

它应该看起来像这样:enter image description here

  1. 保存更改并重新加载页面或应用程序。

设置pcre.jit=0是禁止pcre使用JIT,而不是授予PHP可执行内存的权限。授予权限应通过setsebool完成,因为它被selinux阻止了。 - Quickpick

4
对我来说,我在php.ini文件的[Pcre]中添加了pcre.jit=0,并且这个方法非常有效。

你应该把 php.ini 文件放在哪里 -- 根目录还是 .php 脚本所在的同一文件夹?因为在我的情况下似乎没有任何作用。(再次说明,我是在共享网络托管账户上进行操作,因此无法访问所有内容。) - c00000fd
2
@c00000fd,Dreamhost在其共享主机账户上使用了一种特殊的文件布局,请将该行添加到“~/.php/7.3/phprc”中。详情请参阅:https://help.dreamhost.com/hc/en-us/articles/214200688-php-ini-overview - joelhardi

0
打开你的 php.ini 文件 (C:\xampp\php\php.ini),并搜索以下设置:
;Enables or disables JIT compilation of patterns. This requires the PCRE
;library to be compiled with JIT support.
;pcre.jit=1

取消注释并确保其设置为1

pcre.jit=1

重新启动您的Apache服务器,并使用正确的权限设置,警告将消失。


0

我有Xampp和以前的PHP版本。 我通过观看YouTube上的一个视频来修复了这个错误,视频名为:

PhpMyAdmin Error Warning in .\libraries\classes\Config\FormDisplay.php#

基本上他所做的就是进入PHPAdmin页面的底部并下载了一个新版本,然后在PHPAdmin文件夹(在Mac中)内创建了配置文件,并删除了所有文件,然后将新的PHP admin文件与配置一起粘贴。对我和他都很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接