Вы здесь

Drupal 6: переход от PHP 5.2 к PHP 5.4

white elephantТак сложилось, что с весны не постил новых материалов. Это не значит, что мне нечего рассказать. Программировал, работал и мотался по стране, занимался полезными делами. Только писать в дневник как-то время не находилось. Исправляюсь.
 
Сегодняшняя запись посвящена теме перехода к PHP 5.4.
 
 
Буквально на днях сподобился сделать очередное обновление. Поставил Drupal 6.33, обновил модули и устало заглянул в отчёт о состоянии. Как всегда, висит прежнее предупреждение в разделе File Information Extension, о котором писал в давнишней заметке. Есть у меня «вредная» привычка – с каждым обновлением что-нибудь чинить, или улучшать. Именно поэтому дом, в котором живут добрые люди – живёт вечно.
 
А лечение этой стыдной хвори – простое: установить PHP с версией не меньше 5.3 и подключить модуль (библиотеку расширения) «php_fileinfo» (который ранее назывался «magic_open»). Всё.
 
Дело в том, что сайт находится у хостера (компании, предоставляющей услугу хостинга, от слова «host» - узел, отвечающей за размещение и поддержку моего замечательного «мустанга»). На прежней хостинговой платформе использовался PHP 5.2. И завопил тут я: «Доколе!». На выбор мне предложили перейти на PHP 5.3 или 5.4. Раскинув мозгами, решил, что раз локально сайт без проблем работает с PHP 5.5, то лучше сразу на версию 5.4 – зачем размениваться на мелочи, тем более, что она быстрее, чем 5.3.
 
Не успел моргнуть, как всё свершилось. Сразу после получения письма о переходе – послал сайт в режим обслуживания. Время ловли «таракашек», как без них-то?.. :)
 
Как и предполагал, это не последний релиз PHP 5.4 (на момент написания заметки – 5.4.34), а нечто более раннее. Дело в том, что большинство компаний предпочитают работать с готовыми пакетами программ, а там – что положили… Да и спецов, умеющих и любящих разбираться в тонкостях настроек (что с чем стыкуется, где и как) сейчас как-то не держат – дешевле набрать толпу «студентов». Капитализм, однако. Дёшево и сердито.
 
Делаю первый шаг – открываю стартовую страницу и в журнале «Недавние записи в системном журнале» получаю 9-ть ошибок:
 
Non-static method view::load() should not be called statically в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/views.module в строке 1113.
 
Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_sort.inc в строке 165.
 
Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_sort.inc в строке 165.
 
Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_sort.inc в строке 165.
 
Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_filter.inc в строке 587.
 
Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_filter.inc в строке 587.
 
Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/plugins/views_plugin_query.inc в строке 169.
 
Declaration of views_plugin_style_default::options() should be compatible with views_object::options() в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/plugins/views_plugin_style_default.inc в строке 24.
 
Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/plugins/views_plugin_row.inc в строке 136
 
Многообещающее начало! При дальнейшем движении по страницам – ещё «сладкая парочка»:
 
Non-static method view::load_views() should not be called statically в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/views.module в строке 1071.
 
Non-static method view::db_objects() should not be called statically в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/includes/view.inc в строке 1492.
 
 
Пора разбираться. Главное – определяться, с какого конца тянуть. Несоответствие объявлений – это понятно, а что делать с «Non-static method»? Беглый поиск в поисковике выдаёт следующее – есть несоответствия между работой модулей Drupal и PHP 5.4. Отсюда – четыре решения:
  1. Сделать настройки и решить вопросы в PHP.
  2. Убрать (заглушить) эти ошибки в соответствующем .inc-файле Drupal.
  3. Поставить и заглушить в модуле «Disable messages».
  4. Или внести исправления в модуль(и) Drupal.
 
«Легко видеть», как говорила моя учительница математики, указывать хостеру, что и как он должен делать, я не могу. Ставить ещё один модуль только для того, чтобы «погасить» сообщения об ошибках - не интересно, а что-то поправить в модулях - ещё не готов. Потому поставил простую «заглушку» в Drupal 6.33. Нашёл её на drupal.org, в теме «Strict warning: non-static method view::load()», а именно в комментарии #54 от petyovsky – где написано, что надо в файле /includes/common.inc скорректировать строку:
 
# Filter out strict warnings due to conflicts between views-6.x-2.xx(6.x-3.0) and PHP 5.4
# if ($errno & (E_ALL ^ E_DEPRECATED ^ E_NOTICE)) {
 if ($errno & (E_ALL & ~(E_DEPRECATED | E_NOTICE | E_STRICT))) {
 
Есть. «Заглушка» стоит и можно запускать народ. Ну, а покорный слуга удалился к выполнению своих обязанностей. И только вечером, вкусно отужинав, решил продолжить неблагодарное дело. Ведь, как сказал один таинственный гость:
- Всё это «костыли». Надо править код под php 5.4. Существуют патчи на drupal.org, всё прекрасно правится. Практически все ошибки – это попытка статического вызова нестатического метода класса. Достаточно объявить метод как статический.
 
Будем искать. Самое противное, что не удалось найти готовые патчи (patch) для Views 6.x-3.0. Для 6.x-2.16 есть, а для 6.х-3.0 – нет. А хочется со временем перейти на Drupal 7, значит – откатываться не надо. В ранее указанной теме на drupal.org нашёл patch для Views 6.x-2.xx. Отправляем сайт в режим обслуживания, убираем «заглушку» в common.inc и приступаем к волшебству (работаем в папке модуля «Views»):
 
/includes/handlers.inc (*)
 
# function option_definition(&$options) {
 public static function option_definition(&$options) {
     $options['reduce_duplicates'] = array('default' => FALSE);
   }
 
/includes/view.inc
 
# function db_objects() {
 public static function db_objects() {
     return array('display');
   }
 
# function &load($arg, $reset = FALSE) {
 public static function &load($arg, $reset = FALSE) {
     static $cache = array();
 
# function load_views() {
 public static function load_views() {
     $result = db_query("SELECT DISTINCT v.* FROM {views_view} v");
     $views = array();
     $vids = array();
 
Щёлкаем на стартовую страницу, смотрим ошибки и видим чудо – остались только неверные объявления функций! А как их исправить, думаю понятно – в логе чётко всё прописано:
 
/plugins/views_plugin_row.inc
 
# function options_validate($form, &$form_state) { }
 function options_validate(&$form, &$form_state) { }
 
/plugins/views_plugin_query.inc
 
# function options_submit(&$form, &$form_state) { }
 function options_submit($form, &$form_state) { }
 
/handlers/views_handler_sort.inc
 
# function options_validate(&$form, &$form_state) {
 function options_validate($form, &$form_state) {
 
# function options_submit(&$form, &$form_state) {
 function options_submit($form, &$form_state) {
 
/handlers/views_handler_filter.inc
 
# function options_validate(&$form, &$form_state) {
 function options_validate($form, &$form_state) {
 
А вот, с query() и options() – чуть сложнее. Идём в папку «includes» (модуля «Views») и ищем файлы с текстом их описания (query() и options()). Там их и добиваем:
 
/includes/base.inc
 
# function options() { }
 function options(&$options) { }
 
/includes/handlers.inc
 
# function query($group_by = FALSE) { }
 function query() { }
 
Время проверки. Открываем главную страницу сайта – ошибки исчезли, «как бабка пошептала». Но, успокаиваться рано, продолжаем движение. Так и есть, при работе с таксономией (на «мустанге» - это ключевые слова в «облаке») получаем очередной «плевок»:
 
Creating default object from empty value в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc в строке 34.
 
Это не ошибка в модуле «Views». Это ошибка модуля «Internationalization»
(i18n) версии 6.x-1.10. На что уже есть patch:
 
/all/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc
 
function i18ntaxonomy_term_page($str_tids = '', $depth = 0, $op = 'page') {
       switch ($op) {
         case 'page':
           // Build breadcrumb based on first hierarchy of first term:
# Карандаш 21.10.2014
# Добавляем строку
$current = new stdClass();
           $current->tid = $tids[0];
           $breadcrumb = array();
           while ($parents = taxonomy_get_parents($current->tid)) {
 
Осталось ещё немного покрутить, отправить сайт в работу – пусть ночью что-то роботы найдут. Так и сделал. А утром журнал ошибок показал жалобу при попытке робота гугла посмотреть карту сайта (есть у меня модуль XMLsitemap):
 
Declaration of views_handler_argument::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) в файле /var/www/mustangsoft/mustang-soft.com/sites/all/modules/views/handlers/views_handler_argument.inc в строке 917.
 
«А слона-то я и не заметил». Последняя правка в модуле «Views»:
 
/handlers/views_handler_argument.inc
 
# function options_validate(&$form, &$form_state) {
 function options_validate($form, &$form_state) {
 
 
Всё, теперь – порядок.
Всем удачи! Надеюсь, что и у вас всё получится.
 
23.10.2014 г.      Карандаш.
 
* В версии Drupal 6.35 + Views-6.x-3.2 – я это уже не правил
 
 
P.S.: (24.03.2015 г.)
      При обновлении «движка» сайта до версии 6.35 + Views-6.x-3.2 мне потребовалось меньше правок. В текстах модуля Views появились комментарии о PHP 5.4, и разбираться стало проще и быстрее. Возможно, помогла подготовительная работа – я исключил и удалил неиспользуемые модули. Итог – в одном месте я уже ничего не изменял, а именно в /includes/handlers.inc - объявление функции function option_definition(&$options).
 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer