【问题标题】:"Allocation of JIT memory failed, PCRE JIT will be disabled" warning in PHP 7PHP 7 中的“JIT 内存分配失败,PCRE JIT 将被禁用”警告
【发布时间】:2019-12-08 01:44:53
【问题描述】:

我正在将我的网站从安装在共享网络托管帐户(在 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 中我需要做一些不同的事情来避免该警告吗?

【问题讨论】:

  • 有一个错误提交here。我认为这与您的问题有关。
  • PHP 中没有错误(还有其他 PHP PCRE JIT 错误)但@c00000fd 的问题不是错误。 PHP 尝试为 PCRE JIT 获取可执行内存并被 Dreamhost 的配置阻止(我认为因为 /tmp 已挂载 noexec,Dreamhost 似乎没有使用 SELinux,无论如何原因并不重要)。然后 PHP 显示此消息,回退到非 JIT PCRE,并在禁用 JIT 的情况下继续处理。这就是为什么此消息有时仅出现而页面在其他情况下显示正常的原因。解决方法是将pcre.jit=0 放入php.ini,请参阅下面我对该答案的评论。

标签: php php-7 dreamhost


【解决方案1】:

您应该能够通过使用ini_set 更改警告消息本身建议的config value 来避免此警告:

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

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

【讨论】:

  • 以上都不是,应该是ini_set('pcre.jit, '0'),因为两个参数都应该是string类型。
  • 这是一个糟糕的解决方法,不能解决实际问题。关键是:“授予PHP分配可执行内存的权限。”
  • 我将善意地改写您的评论,并带有一些猜测和假设:“这是一个很好的解决方法,但是为了从正则表达式匹配中获得更好的性能,最好授予 PHP 分配可执行内存的权限。这允许 JIT 系统运行,而不是这种解决方法,它只是禁用 Regex JIT 编译。 OTOH,可能存在保持 JIT 关闭的安全论据。给定一个共享的托管环境,最终的选择可能不是你的选择!”
  • @hackel 您能否就如何“授予 PHP 分配可执行内存的权限”给出答案。 ?
  • 最新版本的 PHP、systemd 和 selinux 对 PHP(和 php-fpm)等系统资源的访问或动态分配施加了限制和安全块。出于生产目的,最安全的设置是在您的 .ini 配置中禁用它(pcre.jit=0),但是如果您想从 selinux 中“取消阻止”它:setsebool -P httpd_execmem on 参考:serverfault.com/questions/991549/…
【解决方案2】:

对我来说,我已将 pcre.jit=0 添加到 [Pcre] 的 php.ini 文件中,效果非常好。

【讨论】:

  • 你应该把php.ini放在哪里——根文件夹或.php脚本所在的同一个文件夹?因为在我的情况下它似乎没有做任何事情。 (同样,我是在一个共享的虚拟主机帐户上进行的,所以我无法访问所有内容。)
  • @c00000fd, Dreamhost has got a special file layout 你应该使用他们的共享主机帐户。将该行添加到~/.php/7.3/phprc
【解决方案3】:
  1. 在管理您网站的任何系统中搜索:cPanel 的文件管理器、您的 网络托管商的管理仪表板您的计算机磁盘- 查找“php” .ini'。在与您的网站或应用程序相关的地方,不会有很多这样命名的文件会向您提供错误消息。

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

它应该看起来像这样:

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

【讨论】:

  • 设置 pcre.jit=0 不允许 pcre 使用 JIT,而不是授予 PHP 对可执行内存的权限。授予权限应该通过 setsebool 完成,因为它被 selinux 阻止。
猜你喜欢
  • 2019-11-08
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多