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 并重新编译,则无法隐藏此消息。但是你可以:
- 将
WarningFrequency
设置为更大的数字,以便在每 N 条警告中只打印 1 条 https://github.com/facebook/hhvm/wiki/runtime-options
或
- (我的选择)修补 WordPress 插件,通知插件作者,并保留您所做更改的差异,以便您可以在重新安装插件时应用它。这很糟糕,很浪费,但这是从根本上解决问题的方法。此外,大多数插件开发人员应该愿意为 HHVM 修复此问题,如果他们获得了工作补丁的话。
或
- 使用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 个警告。
如您所知,此时代码中没有唯一的方法可以将此消息与任何其他消息区分开来。消息设置为警告级别。除了频率检查(这只是防止打印大量相同的消息)
其他,不推荐选项包括
- 删除
ext_std_misc.cpp
中的 raise_warning()
调用并重新编译 hhvm
- 限制日志记录级别,直到此警告消失(https://github.com/facebook/hhvm/wiki/runtime-options)
我们 运行 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 并重新编译,则无法隐藏此消息。但是你可以:
- 将
WarningFrequency
设置为更大的数字,以便在每 N 条警告中只打印 1 条 https://github.com/facebook/hhvm/wiki/runtime-options
或
- (我的选择)修补 WordPress 插件,通知插件作者,并保留您所做更改的差异,以便您可以在重新安装插件时应用它。这很糟糕,很浪费,但这是从根本上解决问题的方法。此外,大多数插件开发人员应该愿意为 HHVM 修复此问题,如果他们获得了工作补丁的话。
或
- 使用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 个警告。
如您所知,此时代码中没有唯一的方法可以将此消息与任何其他消息区分开来。消息设置为警告级别。除了频率检查(这只是防止打印大量相同的消息)
其他,不推荐选项包括
- 删除
ext_std_misc.cpp
中的raise_warning()
调用并重新编译 hhvm - 限制日志记录级别,直到此警告消失(https://github.com/facebook/hhvm/wiki/runtime-options)