21 января 2012 г.

Deprecated: Function eregi() is deprecated

С недавних пор, при обновлении PHP до версии 5.3.0 стала появляться ошибка:

Deprecated: Function eregi() is deprecated in бла-бла-бла on line 19

Вначале из-за нее не мог пользоваться SquirrelMail, потом и Joomla!(точнее – VirtueMart) начала выдавать эту ошибку. Некоторые скрипты глючат, а некоторые и вовсе отказываются работать. Заметил, что в инете инфы о решении данной проблемы немного, и решил написать этот пост.

Deprecated: Function eregi() – причина возникновения

Вначале я просто хотел найти howto, на тему устранения бага, но копаясь в просторах всемирной информационной помойки, узнал, отчего так происходит. Оказывается, с выходом версии PHP 5.3.0 некоторые функции были признаны устаревшими/отстойными/ненадежными, и были заменены на другие. Очень много современных скриптов уже переписаны с учетом новых функций, но что делать, если у меня старый скрипт, и по каким-то причинам не могу его переписать?

Устраняем ошибку

Неверно сказано, так как любое решение будет похоже на костыль, но выбор не особо богат. Итак, можно пойти несколькими путями:
  1. Переписать PHP – скрипт. Не всегда выгодно/удобно/надежно.
  2. Обновить скрипт. Самый лучший вариант, но не всегда доступно обновление.
     
  3. Использовать более старый PHP. Спорный вариант, так как все-таки лучше иметь более новые версии ПО на кампе
     
  4. Включить в php.ini старые, отжившие свое функции. При этом будут отключены новые аналоги этих функций.
     

Мы в этом посте рассмотрим именно последний вариант, так как он теоретически заработает в любом случае и при любых обстоятельствах. Итак, заходим в php.ini и находим там строчки:

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
;mbstring.func_overload = 0


Последняя строка – это закомментированный параметр php.ini, который указывает, для каких функций сделать откат к старым. По сути, кроме eregi() это решит вопрос и с mail(), и с str*(). Раскомментируем параметр(последняя строчка в приведенном выше коде):

mbstring.func_overload = 0

и зададим параметру значение. Если оно равно нулю, как сейчас – это значит что все устаревшие функции отключены, и вместо них используются новые их «наследники». Если же хотим что-нибудь включить, например, mail() и eregi(), то значение будет равно 5 (типа 1+4). Если нужно включить str*() и eregi(), то значение будет равно 6 (4+2). В общем, по такому принципу выставляем параметр по своим требованиям. Я включу ниже только функцию eregi():

mbstring.func_overload = 4

Замечательно. Теперь перезапускаем наш апач.

#sudo service apache2 restart

Все. Должно работать.

Взято тут http://megabytesp.livejournal.com/2873.html

Комментариев нет:

Отправить комментарий