HHVM 配置为 "allow" 不区分大小写的常量

HHVM Configuration to "allow" case-insensitive constants

我们 运行 HHVM 上的 WordPress 和一些插件由于不区分大小写的常量而抛出警告,这意味着 define() 与可选的第三个参数 $case_insensitive = true 一起使用。 AFAIK HHVM 从来没有也永远不会对不区分大小写的常量提供实际支持,警告表明尽管编译成功,但实际行为将表现得好像没有使用参数一样。

虽然我知道不区分大小写的常量很愚蠢,没有它们也没关系,但我也不想说服各种第三方 WP 插件开发人员更新他们的平台代码 (HHVM)可能不会使用。为这样的东西分叉插件是一种消耗。

SO:我希望 HHVM 配置能够消除这些通知

如果开发人员真的利用了不区分大小写的优势,我愿意冒 bug 的风险,因为我怀疑他们这样做,而且我可以更容易地测试以确保他们不会永远管理一个分叉的插件。

如果没有配置选项我可以接受,但我找不到任何答案。 Google、SO 和 ServerFault,所以我想我会是那个提出问题并在 SEO 中获得有用结果的人。

违规代码示例: define("qq_enabled", "enabled", true);

通知示例: Warning: Case insensitive constant names are not supported in HipHop in /var/www/sites/globalvoices_test/_plugins/quantcast-quantifier/quantcast-quantifier.php on line 52

注意:我不是在寻求一种方法来 启用 不区分大小写的常量,我承认出于性能原因不支持它们。我只是不想看到有关它们阻塞我的日志的警告。

TL;DR

如果不更改 HHVM 并重新编译,则无法隐藏此消息。但是你可以:

  1. WarningFrequency 设置为更大的数字,以便在每 N 条警告中只打印 1 条 https://github.com/facebook/hhvm/wiki/runtime-options

  1. (我的选择)修补 WordPress 插件,通知插件作者,并保留您所做更改的差异,以便您可以在重新安装插件时应用它。这很糟糕,很浪费,但这是从根本上解决问题的方法。此外,大多数插件开发人员应该愿意为 HHVM 修复此问题,如果他们获得了工作补丁的话。

  1. 使用logrotate拆分、压缩和自动删除旧日志。

运动

作为一个有趣的练习,我跟踪了 HHVM 代码,看看是否真的可以在不更改代码的情况下以某种方式禁用此消息。

让我们看一下代码。此错误是通过调用 raise_warning(...) (source)

生成的
bool HHVM_FUNCTION(define, const String& name, const Variant& value,
              bool case_insensitive /* = false */) {
  if (case_insensitive) {
    raise_warning(Strings::CONSTANTS_CASE_SENSITIVE);
  }
  return Unit::defCns(name.get(), value.asCell());
}
只要 case_insensitive 为真,就会调用

raise_warning(...)。仅使用表示错误消息的字符串(在头文件中定义)调用它。这看起来不太好,到目前为止,还没有简单的方法可以在 raise_warning 中唯一地标识此消息,因此可能无法使用标准流程对其进行过滤。让我们看看 raise_warning(...) 实际上做了什么。 (source)

void raise_warning(const std::string &msg) {
  if (warning_freq_check()) {
    raise_warning_helper(false, msg);
  }
}

raise_warning(...) 调用 warning_freq_check() 基本上确定是否应记录警告,也允许您仅打印每 N 个警告。

如您所知,此时代码中没有唯一的方法可以将此消息与任何其他消息区分开来。消息设置为警告级别。除了频率检查(这只是防止打印大量相同的消息)

其他,不推荐选项包括

  1. 删除 ext_std_misc.cpp 中的 raise_warning() 调用并重新编译 hhvm
  2. 限制日志记录级别,直到此警告消失(https://github.com/facebook/hhvm/wiki/runtime-options