PHP 5.3.x чтоб его…

После обновления версии php до 5.3.x все сайты покрылись ошибками:

1. date() It is not safe to rely on the system's timezone settings..

2. Function eregi() is deprecated in..

3. Deprecated: Function session_register() is deprecated in

Date, так же как и все функции так или иначе работающие с датой выдают ошибку:

Error: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead (_файл_, _строка_)

Решение:

В начале вашего php файла  добавляем следующую строку:

<?

date_default_timezone_set('Europe/Moscow');

?>

Полный список часовых поясов можно посмотреть тут http://ru2.php.net/manual/en/timezones.php

По вопросу с ereg (eregi), разработчики php решили что это очень медленная функция и приняли решение убрать её совсем, отсюда и эта ошибка. Замечательное решение, блин :(

В замен они предлагают использовать preg_match:

Fix `ereg is deprecated` errors in PHP 5.3

If you upgraded to PHP 5.3, chances are high you’re going to run into a few warnings or deprecated function messages.
An example is the ereg family of functions, which are gone for good, as they were slower and felt less familiar than the alternative Perl-compatible preg family.

To migrate ereg():

ereg("\.([^\.]*$)", $this->file_src_name, $extension);

becomes

preg_match("/\.([^\.]*$)/", $this->file_src_name, $extension);

Notice that I wrapped the pattern (\.([^\.]*$)) around / /, which are RegExp delimiters. If you find yourself escaping / too much (for an URL for example), you might want to use the # delimiter instead.

To migrate ereg_replace():

$this->file_dst_name_body = ereg_replace("[^A-Za-z0-9_]", "", $this->file_dst_name_body);

becomes

$this->file_dst_name_body = preg_replace("/[^A-Za-z0-9_]/", "", $this->file_dst_name_body);

Again, I just added delimiters to the pattern.
If you are using eregi functions (which are the case-insensitive version of ereg), you’ll notice there’re no equivalent pregi functions. This is because this functionality is handled by RegExp modifiers.

Basically, to make the pattern match characters in a case-insensitive way, append i after the delimiter:

eregi("\.([^\.]*$)", $this->file_src_name, $extension);

becomes

preg_match("/\.([^\.]*$)/i", $this->file_src_name, $extension);

Ну а что же делать тем у кого весь сайт напичкам ereg или установлен популярный движок какой нибудь cms которая во всю использует ereg? В первую очередь ищем обновления своих цмс. Если не получилось делаем следующее:

1. Открываем файл настройки PHP (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
; http://php.net/mbstring.func-overload
; mbstring.func_overload = 0

0 - Оставить все без изменений.
1-4 Включить одну из функций.
7 - Включить сразу все функции.
Слово "включить" тут не совсем корректно. Речь идет об включении поддерживания старых функций, при этом новые будут отключены. Если у Вас нету никаких ошибок, то лучше их не включать.

Все это пишется в нижней строке, притом, главное, не забудьте убрать символ ";" в начале строки. Т.е. если Вы хотите, что бы были включены все функции, то нижняя строка примет вид:
Цитата
mbstring.func_overload = 7

Вот и все.

Старые функции, которые мы сейчас включили, в ущерб новым, считаются менее стабильными и более "тормазными". Поэтому, если есть шанс оставить все новое на месте и решит проблему другими способами, то это даже лучше.
По мне лично разницу в скорости не ощутил. А ereg и так быстро очень работает. Все в ваших руках и головах :-) . Лучше конечно отказаться от ereg совсем, наврятли в следующих версиях php возможно будет включить старые функции.

Вместо ereg для поиска подстроки, можно делать так:

$str = "My STRING";
// модификатор i - "без учета регистра" - аналог eregi
if (preg_match( '/trin/i', $str)) {
echo "ok";
}
session_register так же отправлена в небытие:
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
Вместо этой функции теперь просят всегда обращаться к глобальному массиву $_SESSION. Я то конечно не против, но что мешало раньше это сделать.. похоже команда разработчиков php немного поменялась или пришли новые люди.

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