28,80
рейтинг
13 июля 2010 в 16:04

Разное → PHP 5.2 → 5.3: трудности перевода

Так получилось, что мы попробовали перевести некоторые проекты на 5.3 в ходе переезда нашего collocated хостинга, в результате обнаружилась забавная несовместимость на уровне багов между 5.2 и 5.3.

Проблема возникла в недрах нашей CMS, и, как оказалось, имеет занятную предысторию.



Итак, жил да был некий абстрактный класс AbstractController. И были у него несколько свойств, объявленные как private, а также реализация подержка динамических свойств, в частности метод __get().

Если опустить все подробности, ситуацию можно описать так:

abstract class AbstractController {
  private $layout = 'layout';

  public function __get($property) { 
    if (property_exists($this, $property)) 
      return $this->$property;
    else throw new Exception("Missing property: $property");
  }
}

class RealController {
  protected $action = 'action';
}


Метод __get в данном случае реализует read-only доступ к отдельным полям.

Когда-то программисту потребовалось прочитать поле layout для экземпляра производного класса. Несмотря на private, он вызвал $controller->layout, и все получилось! Неплохо, подумал программист, и заюзал такую замечательную фичу. Было это в версии 5.2

То есть, __get реализованный в родительском классе, смог получить доступ для приватного поля, будучи вызван для экземпляра производного класса.

Пишем:

$a = new RealController();
print $a->layout;
print "\n";
print $a->action;
print "\n";


Запускаем в 5.2.10:

Результат:

layout
action


Технический прогресс шагнул вперед и приложение перевели на 5.3. Запускаем и получаем (в 5.3.2):

action
PHP Fatal error:  Uncaught exception 'Exception' with message 'Missing property: layout' in /home/max/test.php:9
Stack trace:
#0 /home/max/a.php(20): AbstractController->__get('layout')
#1 {main}
  thrown in /home/max/test.php on line 9


То есть починили.

UPDATE: все наоборот! Не починили а наоборот сломали, а именно функцию property_exists(). Большое спасибо пользователю LighteR за соответствующий комментарий. Облажался, жара, мозги плавятся.

Морали отсюда две: не ходите куда не положено и пишите юнит-тесты :)

Интересно, много ли shared-хостингов поддерживают нынче 5.3 и когда переход на эту версию станет массовым.
Автор: @mooncube
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Комментарии (35)

  • +3
    Последний обзор хостингов с PHP5.3 на хабре: habrahabr.ru/blogs/php/65573/
    • 0
      Cпасибо! Список хостеров, не планирующих переходить, повергает в уныние. По нынешним временам, конечно, надо вообще забивать на шаред и покупать всегда VPS, но не всем клиентам это можно объяснить.
      • 0
        Вы посмотрите комментарии. Судя по ним, кое-что изменилось. Пока переживать за PHP5.3 рано, но если надо именно 5.3 — можно найти либо с предустановленной версией (где PHP на выбор) или устанавливать свою версию на шаред хостинге, где разрешается.
        Не для всех проектов имеет смысл брать сразу VPS.
        • +1
          >Не для всех проектов имеет смысл брать сразу VPS.

          Более того, для некоторых (а может и для многих) проектов шаред-хостинг, причём довольно дорогой (по отношению с VPS «за 100 рублей»), является оптимальным вариантом, если считать, что админы хостера квалифицированнее администрируют сервер, чем php-программист (а то и просто пользователь CMS). Я вот, в частности, для первого своего действительно коммерческого (b2b SaaS за абонентскую плату, если модными словами бросаться :) ) проекта настойчиво рекомендую «инвестопартнёру» (он же маркетолог и менеджер, я, как не сложно догадаться, разработчик :) ) использовать шаред-хостинг (правда не под PHP, а под python, но там отдельная история), до тех пор пока (и если) наши доходы не позволят использовать услуги (или взять в штат) квалифицированного админа (и, скорее всего, «настоящие» DS, хотя не исключен вариант переезда на GAE, но там тоже свои трудности для меня, как для разработчика). В настоящее время закрытый альфа тест проекта идёт на VPS, который я админю, но даже открытую бету не хочу: мониторинги, бакапы и т. п. 24 часа в сутки — во всё это вникать, да ещё этим заниматься :), времени на разработку не останется.
          • 0
            Есть очень хорошие шареды, по цене сравнимые с VPS с большими возможностями. Как раз для такого варианта.
            • 0
              Я о чём и говорю — по-моему, лучше иметь шаред-хостинг для проекта хоть с какими-то гарантиями (в конце-концов есть на кого «стрелки перевести», если не юридически, то хоть морально :D), чем рисковать проектом из-за того, что VDS/DS хостинг настраивать будут по гайдам: беру свой случай — я могу настроить VPS/DS (и даже настроил, и даже уже 3 очень лояльных клиента работают) так, чтобы он работал (какое-то время), но не могу гарантировать, что после команды «apache2ctl start» (по памяти), прописанной где-то в «автозагрузке» апач не станет слушать какой-нить 8139 порт с докрутом в корне ФС… А что делать, если на любой предусмотренный запрос nginx будет выдавать 500-е ошибки вообще не представляю (утрирую, но всё же).
              • 0
                VPS это не только ценный мех, но ещё и дикий оверселл как правило
          • 0
            Есть хостинги, которые сами администрируют VPS — «расширенное администрирование», в том числе, поддерживают и python. Не бесплатно, конечно, но дешевле собственного админа.
            Но я согласен, для стартапа оптимальнее качественный вирт.хостинг, где всё необходимое уже установлено.
  • –2
    да с переходом на 5.3 вообще масса проблем.
    тот же друпал на нем плющит безмерно.
    хотя contao запустился вообще без проблем.
    наверное сказывается молодость проекта и изначально использующиеся более свежие технологии…
    • +2
      Потому что не следуют рекомендациям разработчиков языка.
      У меня проекты, написанный под 5.2 за последние 1.5 года на 5.3 взлетели без единого Notice и глюков. Естественно я использую E_ALL & E_STRICT при разработке :)
      • +1
        Аналогично, только не использую E_STRICT. Вообще никогда не понимал до конца массовой истерии перехода PHP4-PHP5-PHP5.3, никогда не возникало сложностей с этим.
  • +1
    SpaceWeb точно поддерживает на некоторых серверах. Туда по заявке в саппорт переводят всех желающих. И, разумеется, популярные CMS вроде любимого Drupal там живут комфортно.
    • 0
      Точно, недавно сдал проект на PHP 5.3, письмо в ТП и переключили на 5.3 за что им респект (кстати там ещё какая то джомла стояла, тоже пережила смену версий )
    • 0
      Drupal пока официально не работает нормально на php 5.3, так что не надо ля-ля
      • 0
        Release notes для Drupal 6.14 (а это уже даже не последняя версия), смотрите баг #360605:
        make Drupal core work with PHP 5.3.0 out of the box (fixes for incompatibilities introduced with PHP 5.3.0)
        • 0
          А вы пробовали ставить шестое ядро на php 5.3? Боюсь, что вас ждёт Epic Fail из-за ereg()
          • 0
            Дело в том, что я как раз пробовал. Притом ещё до того, как вы тут ко мне прицепились. И на виртуальном хостинге упомянутого СпейсВеба, и на собственном VPS. Я же выше уже показывал вам баг, вместе с которым проблема была закрыта. Это было в 6.14, а сейчас уже 6.17.

            Обратите внимание ещё и на то, что я говорю именно о ядре Drupal`а, а не о модулях расширения. Хотя для всех популярных модулей либо мэинтейнеры уже выпустили обновления, либо в комментариях к репортам уже висят патчи или указания какие пару строк надо изменить, чтобы заработало (в духе там-то вот уберите передачу по ссылке и пр.).
  • +1
    Массовый переход пока не замечен. При наличии PHP 5.3 — эту возможность используют единицы. Видимо, поэтому отсутствие активного интереса у хостеров и не присутствует.
  • +3
    Может все-таки:
    class RealController extends AbstractController
  • +14
    Несмотря на private, он вызвал $controller->layout, и все получилось!

    То есть, __get реализованный в родительском классе, смог получить доступ для приватного поля, будучи вызван для экземпляра производного класса.

    Что вас здесь удивляет? Это ожидаемое поведение. Метод суперкласса имеет доступ ко всем своим private- и protected-полям.

    Запускаем и получаем (в 5.3.2)…
    То есть починили.


    Изменилось не модель доступа (она осталась точно такой же), а поведение функции property_exists(). И не починили, а сломали ибо это баг.

    Так что ваш код вполне верный.
    • 0
      На месте автора я бы добавил этот коммент в топик, дабы не вводить людей в заблуждение.
    • 0
      Еще одна капля, в задержку перехода на 5.3.
    • 0
      Опс, действительно, проблема в property_exists, эк я стормозил :(
  • –4
    А кто еще пользуется Shared хостингами?
    • 0
      Те, кому не по карману «личные» админы, но вставать посреди ночи из-за звонков клиентов и разбираться что опять серваку (не скриптам) не нравится не очень хочется.
      • 0
        Ну не знаю, мои клиенты звонят тому, кому могут дозвониться и это явно не саппорт шаред хостинга.
        Отказался я от этой попрочной практики, т.к. тебя все-равно тревожат, а сделать ты толком ничего не можешь.
        Определить на глаз, что именно глючит может только знающий человек.

        А ВПС, обычно, работает себе и работает. Надо руби — поставил руби, надо питон — поставил питон, нод пхп 6.1 преаАльфаКонцепт_анрелизед — поставил пхп 6.1 преальфаконцепт_анрелизед.
        • 0
          Впс обычно себе работет и работает, только если его грамотно настроят. Я, помню, лишился возможности хоститься у одного из популярнейших в России «свой сервер с рутовым доступом по ssh за 100 рублейв месяц, а то и меньше» лишь только из-за факта «подтвердил регистрацию и оплатил на год» и забил на полгода (ничего на хост не заливая напрямую, просто прописав пару строчек «apt-get install ...»). Оказалось, что меньше месяца через мой выделенный (вроде как) IP шли спам рассылки… Хостер, кстати, не захотел сотрудничать даже на условиях «проплачиваем максимальный тариф на 10 лет вперёд)
          • –1
            Ну я даже не знаю. Может вы просто сендмайл без пароля оставили спамеры к таким сервакам присасываются очень быстро. Сканеры они ж не дремлят.

            А мудаки они везде есть. Это как я буду рассказывать, что заказал дизайн, а дизайнер пропал, так что теперь все дизайнеры козлы?

            Мне кажется, что найти VPS без мудаков-хостеров, гораздо проще, чем найти шаред без мудаков-хостеров, где установлены все нужные вам библиотеки, и есть гарантия, что они не будут обновлены в один прекрасный день.
  • 0
    property_exists тут явно глючит. В svn-е баг уже пофиксили.

    Я использую php 5.3 потому что он быстрее.
    www.slideshare.net/phpclub/php53 (На предпоследней странице сравнение)
  • 0
    При переводе проекта руководствовался оф. документацией. Несколько дней пришлось покопаться (по большой части из-за depricated pcre), а так — без особых проблем.
    И да, не хватает PHP-разработчике высокой культуры UNIT-тестирования.
    • 0
      Поправка — deprecated объявлены не pcre функции, а функции, основанные на posix regerx'ах. Не проснулся ещё )
  • 0
    Держу у себя свои проекты и десяток-другой сайтов клиентов (визитки в основном).

    На VPS сдуру обновились до PHP 5.3.1, потом пришлось откатываться до 5.2.13. Из-за отсутствия Zend Optimizer и кучи предупреждений в популярных CMS (а убивать предупреждения в давным-давно сделанных сайтах, да ещё за бесплатно было лень).

    Когда арендовали отдельный сервер, поставили php 5.2.13. И никаких проблем.

    На мой взгляд, программное обеспечение, если оно рассчитано на массовый рынок, не должно требовать последние версии компиляторов языков программирования, баз данных, операционных систем и т.д.

    Использовать «свежатину» для рабочего проекта или хостинга клиентов тоже могут позволить себе немногие. Основные расходы — они не на железо, а на рабочее время людей…
  • 0
    class RealController {
    подразумевается
    class RealController extends AbstractController{
    видимо?
  • –2
    зачем писать серверный код на пхп, когда его можно писать на яве?
  • 0
    трудности перевода…
    Вам еще в конце 2005го говорили, как правильно писать, чтобы потом под PHP6 заработало!
    Никто ж не прислушивался, как всегда?
    У меня проблем перехода практически не было: несколько Notice и все…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разное