Конфигурация HHVM, позволяющая использовать константы без учета регистра.

Мы запускаем WordPress на HHVM, и некоторые плагины выдают предупреждения из-за нечувствительных к регистру констант, что означает, что define() использовался с необязательным третьим аргументом $case_insensitive = true. AFAIK HHVM никогда не имел и никогда не будет фактической поддержки констант без учета регистра, предупреждение указывает, что, несмотря на успешную компиляцию, фактическое поведение будет действовать так, как если бы аргумент не использовался.

Хотя я понимаю, что константы, не чувствительные к регистру, глупы, и это нормально, что их нет, я также не хочу убеждать различных разработчиков сторонних плагинов для WP обновлять свой код для платформы (HHVM), которую они, вероятно, не используют. . Разветвление плагинов для таких вещей — это утечка.

Итак: я надеюсь, что конфигурация 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

ПРИМЕЧАНИЕ. Я не прошу способ включить нечувствительные к регистру константы, я согласен с тем, что они не поддерживаются из соображений производительности. Я просто не хочу видеть предупреждения о том, что они засоряют мои журналы.


person jerclarke    schedule 06.04.2016    source источник


Ответы (1)


TL;DR

Это сообщение невозможно скрыть без изменения HHVM и перекомпиляции. Но ты можешь:

  1. Установите для WarningFrequency большее число, чтобы печатать только 1 из каждых N предупреждений https://github.com/facebook/hhvm/wiki/runtime-options

or

  1. (Мой выбор) Исправьте плагины WordPress, уведомите авторов плагинов и сохраните изменения ваших изменений, чтобы вы могли применить их, если когда-нибудь переустановите плагин. Хреново, это сток, но так решишь проблему в корне. Кроме того, большинство разработчиков плагинов должны быть готовы исправить это для HHVM, если им будет предоставлен рабочий патч.

or

  1. Используйте logrotate для разделения, сжатия и автоматического удаления старых журналов.

Упражнение

В качестве забавного упражнения я проследил код HHVM, чтобы увидеть, действительно ли можно каким-то образом отключить это сообщение без изменения кода.

Давайте посмотрим на код. Эта ошибка возникает при вызове raise_warning(...) (источник)

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());
}

raise_warning(...) вызывается всякий раз, когда значение case_insensitive равно true. Он вызывается ТОЛЬКО со строкой, представляющей сообщение об ошибке (определенной в заголовочном файле). Пока это выглядит не слишком хорошо, нет простого способа однозначно идентифицировать это сообщение в raise_warning, поэтому, вероятно, его нельзя будет отфильтровать с помощью стандартного процесса. Давайте посмотрим, что на самом деле делает raise_warning(...). (источник)

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

raise_warning(...) делает вызов warning_freq_check(), который в основном определяет, следует ли регистрировать предупреждение, и позволяет вам также печатать только каждые N предупреждений.

Как вы понимаете, на данном этапе кода нет уникального способа отличить это сообщение от любого другого сообщения. Сообщение устанавливается с уровнем ПРЕДУПРЕЖДЕНИЕ. Помимо проверки частоты (которая просто предотвращает печать тонны одного и того же сообщения)

Дополнительные, не рекомендуемые параметры включают

  1. Удаление вызова raise_warning() в ext_std_misc.cpp и перекомпиляция hhvm
  2. Ограничение уровня ведения журнала до тех пор, пока это предупреждение не будет отключено (https://github.com/facebook/hhvm/wiki/runtime-options)
person edhurtig    schedule 15.04.2016
comment
Спасибо за этот отличный ответ! Очень ценю, что вы нашли время, чтобы посмотреть в коде причины и попытаться найти реальное исправление для меня! Я доволен 2 (исправить плагины) и надеюсь, что этот пост + ответ поможет всем, кто задается вопросом о том, что происходит и есть ли простое решение :) - person jerclarke; 16.04.2016
comment
Спасибо, Джереми! Я тоже надеюсь, что этот ответ поможет другим! - person edhurtig; 19.04.2016