Ромка!eu

  • Отдых
  • Работа
Главная — Блоги — Ромка's blog

Это старая (Drupal 6) версия сайта romka.eu. Она больше не обновляется, комментирование материалов отключено. Обновленная версия сайта доступна по адресу http://romka.eu.

Любопытное поведение модуля syslog в шестом Друпале (баг?)

Ромка — Втр, 03/13/2012 - 13:21

Описание проблемы

На сайте используется Drupal 6 и модуль theme key, который позволяет задавать разный дизайн для разных страниц. Столкнулся с неприятной и трудноуловимой проблемой: есть 2 полностью идентично настроенных (как казалось изначально) сервера, на одном из которых theme key отрабатывает корректно, а на втором нет — все время отображает контент в дефолтной теме оформления. Похожая проблема также встречалась в другом проекте, не использующем theme key, на странице управления блоками.

После некоторых экспериментов удалось выяснить, что сервера отличаются настройкой PHP error_reporting. На глючащем сервере она была задана так:

error_reporting = E_ALL & ~E_DEPRECATED

на работающем так:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE

Обновление этой настройки на некорректно работающем сервере решало проблему. Может показаться что это магия какая-то, мне так изначально и показалось: ну какое отношение имеют сообщения, выводимые в лог, к работе модулей и выбору темы оформления Друпала? В итоге, оказалось, имеют самое непосредственное отношение. Ниже описание причины проблемы и её решение.

В Друпале с помощью PHP-шной функции set_error_handler задается собственный обработчик ошибок — функция drupal_error_handler. Эта функция, получив сообщение об ошибке, решает писать его в лог или нет, и, для записи в лог, вызывает функцию watchdog. Функция watchdog, в свою очередь, вызывает все зарегистрированные в системе хуки hook_watchdog.

По умолчанию в Друпале включен модуль dblog, реализующий этот хук, в нашем случае этот модуль был выключен, так как он пишет лог в БД, и при высокой посещаемости создает большую нагрузку на базу. Вместо dblog мы использовали другой ядерный модуль — syslog, он пишет свои сообщения в системный журнал.

Небольшое отступление

Загрузка ядра Друпала выглядит примерно так:

  1. Много нужных, но неинтересных сейчас действий,
  2. загрузка модулей,
  3. выполнение всех hook_init (в том числе и themekey_init()),
  4. опять много нужных, но непринципиальных сейчас действий,
  5. вызов функции theme(), для отображения сгенерированной страницы.

В Друпале определяется переменная $theme, в которой хранится имя темы оформления, которая должна использоваться для отображения текущей страницы. По умолчанию, эта переменная определяется при первом вызове функции theme(), однако если к первому вызову этой функции переменная уже определена, то она не переопределяется. Этим и пользуется модуль themekey, определяя переменную $theme в своем hook_init до первого вызова функции theme(). При этом если переменная $theme уже определана до вызова themekey_init(), то модуль theme key её не переопределяет. В случае если Друпал работает без ошибок такая ситуация (определение переменной $theme до вызова themekey_init()) невозможна.

Причина и решение

Причина проблемы, с которой столкнулся я, состояла в том, что на этапе загрузки модулей возникала ошибка (даже не ошибка, а notice). Недостаток модуля syslog состоит в том, что он формирует строку, записываемую в лог, при помощи функции theme() (модуль dblog этого недостатка лишен), таким образом, если ошибка возникает до вызова themekey_init(), устанавливается дефолтная тема оформления, которую theme key уже не переопределяет.

У проблемы оказалось 3 решения (в порядке от худшего к лучшему):

  • отключить syslog — не очень хорошее решение, так как лог таки нужен, а писать его в БД модулем dblog на больших объемах данных это очень дорогая операция,
  • отключить вывод в лог некоторых типов ошибок (в моем случае notice'ов),
  • исправить все ошибки, чтобы в лог нечего было писать.
  • Drupal 6
  • Работа
  • Ромка's blog

Обо мне

Всем привет!
Меня зовут
Роман Архаров, я профессиональный веб-разработчик, программирую на языках PHP, Python и Action-Script, в работе использую фреймворки Drupal и Django. В этом блоге я размещаю заметки и статьи, связанные с моей работой, отдыхом и другими интересными мне темами.

Похожие заметки

  • Пример разработки плагина для модуля CCK
  • Swftools и модуль Pdf2SWfField для Друпала
  • Доклад на DrupalConfMoscow 2011
  • Тестирование модуля "Inner poll"
  • Модуль "Курсы валют" для Drupal 6

Популярные заметки

  • Авторизация на Drupal-сайте с помощью аккаунта ВКонтакте
  • Перетаскивание строк таблицы. Table drag and drop — плагин для jQuery
  • Темизация Drupal. Часть 3. Основы Drupal Forms API и темизация форм
  • Темизация Drupal. Часть 4. Темизация Views
  • AJAX. Обмен данными между клиентом и сервером, закачка на сервер файлов без перезагрузки страницы при помощи библиотеки jQuery.
  • Кеширование на Drupal-сайте. Сравнение встроенного в Drupal кеша, статического файлового кеша (модуль Boost) и Varnish
  • Тестирование модуля "Inner poll"
  • Несколько панорам из путешествия по Перу и Боливии
  • Arduino + bluetooth, небольшая проблема
  • Пример разработки плагина для модуля CCK

Подписка


Последние комментарии

  • drupal-admin → Кеширование на Drupal-сайте. Сравнение эффективности встроенного в Drupal кеша, статического файлового кеша (модуль Boost) и Var → Отличная статья
  • Меховщиков Руслана → Проверка имени пользователя на наличие букв из разных алфавитов → Re: Читал про это уже на
  • Вероника → Куба. Лето 2008. Часть 3 → По поводу "приветливых жителей" Тринидада
  • Sfero → Статья в PC Magazine/RE. Drupal: разработка модуля → Немного о контенте
  • RemaGe → Статья в PC Magazine/RE. Drupal: разработка модуля → -)
  • Ромка → Статья в PC Magazine/RE. Drupal: разработка модуля → Да, будет сборка, та которую
  • RemaGe → Статья в PC Magazine/RE. Drupal: разработка модуля → -)
  • anatinge → Поездка в Киев → спасибо :)
  • Ромка → Поездка в Киев → Да, в общем-то, ничего
  • GogA → Поездка в Киев → Заинтриговал, что там за

Новые заметки

  • Кеширование на Drupal-сайте. Сравнение встроенного в Drupal кеша, статического файлового кеша (модуль Boost) и Varnish
  • Любопытное поведение модуля syslog в шестом Друпале (баг?)
  • Arduino + bluetooth, небольшая проблема
  • Гугл 1 марта прекратил поддержку сервиса Google Friend Connect
  • Проба пера в HTML5 + canvas. Эффект ластика
  • Шесть рукопожатий
  • Доклад на DrupalConfMoscow 2011
  • Статусы разных сущностей в Друпале 6
  • Футер, прибитый к низу страницы
  • Путешествие по Перу и Боливии. Часть 2

Тэги

Drupal jquery Куба Лето 2007 Лето 2008 Отдых Работа Штуки-дрюки лето модуль статья цитата
еще тэги

Навигация

  • Exchange rate
  • Переход по внешней ссылке
  • Последние сообщения
  • Фотогалереи

Курсы валют

  • 100 Казахстанских тенге — 21,3687 (-0.43)
  • 10 Украинских гривен — 27,2852 (-13.04)
  • 1 Китайский юань — 10,2706 (-40.98)
  • 100 Японских иен — 53,5332 (+12.67)
  • 1 Доллар США — 65,6210 (+33)
  • 1 Евро — 69,8076 (+29.42)
  • 10000 Белорусских рублей — 36,3310 (-2.51)
  • 1 Турецкая лира — 22,9540 (+4.99)

10 случайных заметок

  • Разработка сайта на Drupal. Часть 3. Модули Drupal.
  • Футер, прибитый к низу страницы
  • Проба пера в HTML5 + canvas. Эффект ластика
  • Осло
  • Купил и прикрутил к сайту новый дизайн.
  • Лето 2007. Путешествие в Камбоджу – Таиланд – Малайзию. Часть 3. Камбоджа, Пномпень.
  • Новый дизайн для Швабрашвабр
  • С Новым Годом!
  • Google Developer Day 2009
  • Разработка сайта на Drupal. Часть 2. Архитектура Drupal.

Случайные фото

Тринидадские спортсменчики
Парашютист в Варадеро
А это уже полуостров Крым, на пути в Керчь.
Красная поляна
Судак, Генуэзская крепость
На пути в Баракоа
Дорожка
Оденсе
Фонарь
Копенгаген, Кристиания, Граффити 6
Я и бамбук
Буквы
Дерево в Прамбанане
На подходе к Красной поляне...
Копенгаген, Кристиания, Граффити 3
Собака
  • Отдых
  • Работа

При использовании материалов с сайта, пожалуйста, ставьте ссылку на источник. E-mail для связи: mne@romka.eu.