HHVM配置为“允许”不区分大小写的常量

时间:2016-04-06 16:52:49

标签: php constants hhvm

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

虽然我认识到不区分大小写的常量是愚蠢的,没有它们也没关系,但我也不想说服各种第三方WP插件开发人员为他们可能不喜欢的平台(HHVM)更新他们的代码不要用。像这样的东西的分叉插件是一个排水管。

SO:我希望HHVM配置会使这些通知无效

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

如果没有配置选项我可以忍受,但我找不到任何答案。 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

注意:我不是要求一种方法来启用不区分大小写的常量,我接受它们因性能原因而不受支持。我只是不希望看到有关它们堵塞我的日志的警告。

1 个答案:

答案 0 :(得分:1)

TL; DR

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

  1. WarningFrequency设置为更高的数字,仅在每N个警告https://github.com/facebook/hhvm/wiki/runtime-options
  2. 中打印1

    1. (我的选择)修补WordPress插件,通知插件作者,并保持变化的差异,以便在重新安装插件时可以应用它。它糟透了,它是一个消耗品,但这就是你在根本上解决问题的方法。此外,大多数插件开发人员应该愿意为HHVM修复此问题,如果他们获得了有效的补丁。
      1. 使用logrotate拆分,压缩和自动删除旧日志。
      2. 运动

        作为一项有趣的练习,我通过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为true,就会调用

        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个警告。

        正如您所知,在代码中此时没有任何唯一的方法可以从任何其他消息中识别此消息。消息将设置为WARNING级别。除了频率检查(这只是防止打印大量相同的信息)

        其他不推荐选项包括

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