ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Особенности миграции на PHP 5.3.x
  #1  
Старый 27.12.2009, 19:56
Аватар для PandoraBox
PandoraBox
Постоянный
Регистрация: 06.05.2007
Сообщений: 393
Провел на форуме:
1510937

Репутация: 398
Отправить сообщение для PandoraBox с помощью ICQ
По умолчанию Особенности миграции на PHP 5.3.x

Устанавливая новое программное обеспечение на крупном проекте, работающем на CentOS linux, я сталкнулся с тем, что все сайты, располагающиеся на сервере стали выдавать ошибки:

Цитата:
Deprecated: Function eregi() is deprecated in ...
Deprecated: Function split() is deprecated in ...
Deprecated: Function ereg_replace() is deprecated in ...
  • Что было мягко говоря странно и весьма неприятно. Что же сделать, чтобы не возникали ошибки вида ошибки вида Deprecated: Function is deprecated in" href="../page/deprecated">Deprecated: Function is deprecated in?

    Углубившись в проблему я быстро выяснил, что возникновение данных ошибок связано с переходом на php версии 5.3.1, в которой появились некоторые изменения. Конечно такая ситуация как обычно описана в manual'е, но как говорится, кто бы знал!

    Что такое deprecated вообще? Это функции, опции и другие возможности приложения, в данном случае php, которые помечены как неиспользуемые и в ближайших версиях будут удалены. Это заставляет задуматься и переписать свой код, без использования данного функционала или заменив его аналогами, которые предлагает официальный сайт php.

    В данной статье я расскажу Вам о особенностях миграции на ветку php 5.3.x и еще несколько интересных моментов
Функции более не используемые в ветке PHP 5.3.x. Deprecated функции
  • Начнем с того, что в ветке 5.3.x появилось два новых уровня предупреждения об ошибках (error level), из-за которых ошибки на страницах и появляются. Теперь в распоряжении php-разработчиков есть, помимо прочего, E_DEPRECATED и E_USER_DEPRECATED уровни отображения, управляющие выводом предупреждений (warnings) на глобальном уровне и на уровне приложений пользователя, соответственно.

    Первым делом, сталкнувшись с проблемой возникновения ошибки Deprecated: Function function() is deprecated in необходимо выключить данные предупреждения в своем php.ini файле, чтобы сайты восстановили работоспособность и не выдавали headers already sent и прочие возможные неприятности от подобного вывода ошибок.

    А теперь давайте рассмотрим более подробно полный список изменений deprecated возможностей в версии php 5.3.1, которые описаны на официальном сайте в разделе Migrating from PHP 5.2.x to PHP 5.3.x, но к сожалению на английском языке.
Опции php.ini
  • Касательно изменений в файле php.ini, то, как я уже говорил, по умолчанию считается включеным E_DEPRECATED уровень предупреждений об ошибках, который включает в себя E_USER_DEPRECATED. Так же как deprecated помечены следующие опции конфигурационного файла php:
    • define_syslog_variables - отвечает за переменные системного журнал. По умолчанию и впредь - выключен.
    • register_globals - теперь у нас всегда register_globals = Off! Прощай багнутый код от школьников и студентов! Ура
      register_long_arrays
    • safe_mode - безопасный режим зависит от ключа компиляции --enable-safe-mode и если таковой присутсвует, то безопасный режим включен. По умолчанию считается выключеным.
    • magic_quotes_* - так же будут ликвидированы при смене версии, а сейчас по умолчанию принимают значение Off
      Так же в конфигурационном файле теперь нельзя использовать Си-комментарии, то есть комментарии, начинающиеся с символа '#'
Более не используемые функцииБолее не используемые функции
  • С чего собственно все и началось, то есть откуда ноги растут у упомянутых в начале статьи ошибок! В php 5.3.x помечены как более не используемые (deprecated) следующие функции:

    call_user_method() - используйте вместо нее функцию call_user_func()
    call_user_method_array() - используйте вместо нее функцию call_user_func_array()
    define_syslog_variables()
    dl()
    Все, что связанно с регулярными выражениями с использованием функций ereg() разработчики посчитали устаревшим функционалом, и к тому же данные функции работают очень медленно, поэтому вместо них предлагается использовать аналогичные фукнции preg(). Соответственно следующие функции более не используются:
      • ereg() - впредь используйте preg_match()
      • ereg_replace() - впредь используйте preg_replace()
      • eregi() - впредь используйте preg_match() с модификатором 'i'
      • eregi_replace() - впредь используйте preg_replace() с модификатором 'i'
      • split() - впредь используйте preg_split()
      • spliti() - впредь используйте preg_split() с модификатором 'i'
    • set_magic_quotes_runtime() и ее синоним magic_quotes_runtime()
    • session_register() - используйте суперглобальный массив $_SESSION
    • session_unregister() - используйте суперглобальный массив $_SESSION
    • session_is_registered() - используйте суперглобальный массив $_SESSION
    • set_socket_blocking() - впредь используйте stream_set_blocking()
    • sql_regcase()
    • mysql_db_query() - впредь используйте mysql_select_db() и mysql_query()
    • mysql_escape_string() - впредь используйте mysql_real_escape_string()
    • Так же больше не используются следующие возможности:
      • Передача в переменную параметра по ссылке в new
      • Вызов call-time (функцииб методы классов) по ссылке
      • Использование {} для указания смещения внутри строки. Обращайтесь к строке как к массиву, используя []
Изменяйте код!
  • Многие из Вас обнаружив ошибки при переходе на php 5.3.1 и поискав информацию в поисковых системах или же воспользовавшись данной статьей, чтобы избежать вывода ошибок вида Deprecated: Function function() is просто отключит уровни предупреждений E_DEPRECATED и E_USER_DEPRECATED в файле php.ini. Такой подход конечно возможен на этапе принятия экстренных мер по восстановлению работоспособности сайтов, но не более того.

    Не ленитесь, измените свой код в сооветствии с новыми требованиями и возможностями (а новых возможностей в php 5.3.x появилось немало)! Сейчас Ваши функции еще работают и просто выдают предупреждения, но новый релиз может застать Вас в расплох и поддержка каких-то функций в нем уже не гарантируется, поэтому лучше позаботиться о валидном коде заранее, а не делать все в авральном режиме.

    Стоит заметить, что разработчики php планируют убрать большинство описанных выше deprecated функций только к выходу PHP6, но как показывает практика, такие изменения могут быть внесены и раньше.
Еще немного о изменениях в PHP 5.3.x
  • Конечно при выходе php 5.3.1 появилось довольно много изменений и описывать их здесь смысла нет, так как все они есть на официальном сайте. Однако стоит отметить, что есть довольно интересные и полезные вещи, например, поддержка пространства имен (namespace), static функции в методах классов (static функции не переопределяются при расширении класса через extend) и многое другое.

    Раз уж мы изначально заговорили о deprecated функциях в php 5.3.1, то справедливости ради стоит сказать и о undeprecated функциях, то есть о функционале, который был ранее помечен как deprecated, но потом оставлен в релизе. Такая функция всего одна - is_a, которая была помечена как deprecated в версии php 5.0.0 и по сути дела является синонимом функции instanceof(), но по просьбам сообщества была возвращена возможность использовать данный сисноним. Дело в том, что к функции просто привыкли, да и записывать ее удобнее, потому что она короче. Разработчики пошли на встречу потребителям своего продукта, что весьма похвально.
Не забудьте про временную зону![LIST]В новой версии PHP обязательно необходимо указать в конфигурационном файле php.ini параметр date.timezone иначе интерпретатор будет отображать Вам предупреждения при работе с любой функцией даты или времени. Например, можно указать так:
Код:
 date.timezone = Europe/Kiev
Источник: http://www.master-blog.ru/page/deprecated

Последний раз редактировалось PandoraBox; 15.01.2010 в 04:12..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ