Запустить VOC++ на php 5.6

mychatik

Support
Команда форума
Регистрация
26.05.15
Сообщения
519
Реакции
452
Баллы
63
Замена ereg (eregi) на preg_match
Замена ereg_replace (ereg_replacei) на preg_repalce

(для тех, кто не в курсе, символ "i" в конце функции означает регистронезависимый поиск)

Начиная с PHP 5.3, разработчки решили избавиться от POSIX регулярных выражений (ПОДРОБНЕЕ).
В самом деле, зачем нужны две библиотеки для работы с регулярными выражениями, если можно обойтись одной?
К тому же, POSIX регулярные выражения гораздо медленнее чем Perl совместимые регулярные выражения (PCRE).

Просто взять и заменить одно выражение на другое нельзя. Будет выдано сообщение об ошибке.
Для корректной замены, необходимо:

1. Заменить ereg и eregi на preg_match, ereg_replace и ereg_replacei на preg_repalce;
2. Добавить разделители в начало и конец регулярного выражения;
3. Если POSIX функция заканчивается на i (eregi, ereg_replacei), то добавить i в конец регулярного выражения, после разделителя.

P.S. Не забывайте экранировать обратным слешем \ мета-символы ^ $ * + - ? . \ |, если они используются в регулярных выражениях в качестве того символа, каким они есть, а не в качестве специального символа.

---------------------------------

Примеры замены:

В /admin/search.php ищем:
PHP:
if (eregi($ttt,$t_nickname)) $users_to_show[] = $user;
и меняем на:
PHP:
if (preg_match("/".$ttt."/i", $t_nickname)) $users_to_show[] = $user;
В этом файле можно сделать ещё лучше:
PHP:
 if (mb_stripos($t_nickname, $ttt) !== false) $users_to_show[] = $user;
P.S. Данная функция намного проще и быстрее регулярки, но её нужно использовать осторожно.
Не везде она сможет заменить регулярное выражение.
К примеру, если применить её в /data/engine/files/users_search.php - то поиск по * перестаёт работать.

В /plugins/antihack/plugin.php ищем:
PHP:
$string = ereg_replace ("[^a-zA-Z0-9.]", "", $string);
и меняем на:
PHP:
$string = preg_replace("/[^A-Za-z0-9\.]/", "", $string);
(В этом примере, спецсимвол . был заэкранирован)

---------------------------------

Файлы, в которых необходима замена:
Скрытое содержимое доступно для зарегистрированных пользователей!
 

mychatik

Support
Команда форума
Регистрация
26.05.15
Сообщения
519
Реакции
452
Баллы
63
Замена split на explode или preg_split.

С версии PHP 5.3.0 функция split считается УСТАРЕВШЕЙ. В PHP 7.0 - удалена.

Меняется она на функцию explode, которая не использует регулярных выражений и поэтому работает намного быстрее.
Если же нужно разбить строку по регулярному выражению - тогда применяется более быстрая функция preg_split.

В чатах на движке VOC++ - все split меняются на explode, без каких-либо дополнительных изменений в коде.

-----------------------------------------

Файлы, в которых нужна замена:
Скрытое содержимое доступно для зарегистрированных пользователей!
 

mychatik

Support
Команда форума
Регистрация
26.05.15
Сообщения
519
Реакции
452
Баллы
63
Замена each на foreach.

Функция each объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0.
И хотя на PHP 5 она ещё полностью валидна, использовать её крайне не рекомендуется.

Заменить эту функцию желательно ещё и по причине её медлительности. if внутри foreach будет на порядок быстрее.
После замены этой функции в designes/дизайн/user_info.php, вкладка Подарки (<DT><?=$w_items_opt;?></DT>), большое количество подарков реально перестало "подвешивать" открытие профиля!

Сравнительный тест производительности:
PHP:
/**
* @BeforeMethods({"init"})
* @Iterations(5)
*/
class IterBench
{
    private $array;
    private $filename;

    public function init()
    {
        $this->array = range(1, 1000000);
    }

    public function benchForeach()
    {
        foreach ($this->array as $key => $value);
    }

    public function benchEach()
    {
        while (list($key, $value) = each($this->array));
    }

    public function benchFor()
    {
        $count = count($this->array);
        for ($i = 0; $i < $count; ++$i);
    }
}

Результаты:
Форматирование (BB-код):
/srv # ./vendor/bin/phpbench run IterBench.php --report=aggregate
PhpBench 0.14.0 (@git_version@). Running benchmarks.
Using configuration file: /srv/phpbench.json

\IterBench

    benchForeach                  I4 P0     [μ Mo]/r: 30,202.800 29,886.746 (μs)     [μSD μRSD]/r: 423.400μs 1.40%
    benchEach                     I4 P0     [μ Mo]/r: 587,427.800 584,176.059 (μs)     [μSD μRSD]/r: 6,420.265μs 1.09%
    benchFor                      I4 P0     [μ Mo]/r: 42,743.000 42,742.724 (μs)     [μSD μRSD]/r: 30.607μs 0.07%

3 subjects, 15 iterations, 3 revs, 0 rejects, 0 failures, 0 warnings
(best [mean mode] worst) = 29,821.000 [220,124.533 218,935.176] 30,729.000 (μs)
⅀T: 3,301,868.000μs μSD/r 2,291.424μs μRSD/r: 0.855%
suite: 133ecf2b3038570f7c4970734ecef34bc077c712, date: 2018-02-10, stime: 22:25:55
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+
| benchmark | subject      | groups | params | revs | its | mem_peak    | best          | mean          | mode          | worst         | stdev       | rstdev | diff   |
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+
| IterBench | benchForeach |        | []     | 1    | 5   | 34,638,288b | 29,821.000μs  | 30,202.800μs  | 29,886.746μs  | 30,729.000μs  | 423.400μs   | 1.40%  | 1.00x  |
| IterBench | benchEach    |        | []     | 1    | 5   | 34,638,656b | 581,722.000μs | 587,427.800μs | 584,176.059μs | 599,139.000μs | 6,420.265μs | 1.09%  | 19.45x |
| IterBench | benchFor     |        | []     | 1    | 5   | 34,638,288b | 42,696.000μs  | 42,743.000μs  | 42,742.724μs  | 42,790.000μs  | 30.607μs    | 0.07%  | 1.42x  |
+-----------+--------------+--------+--------+------+-----+-------------+---------------+---------------+---------------+---------------+-------------+--------+--------+

Как видно из тестового кода, строка вида
PHP:
while (list($key, $val) = each($arr))
меняется на
PHP:
foreach ($arr as $key => $val)

Соответственно, строка вида
PHP:
while(list(, $val) = each($arr))
меняется на
PHP:
foreach($arr as $val)

А строка без цикла while
PHP:
list(, $val) = each($arr)
меняется на
PHP:
$val = array_values($arr)

Или такая функция
PHP:
function Func() {
$val = each($arr);
return $val['1']; }
может быть заменена на
PHP:
function Func() {
$val = current($arr);
next($arr);
return $val; }

На примере чата:
Мод подарки по страницам (дизайн/profile_content.php).
PHP:
while(list($i,$curr_item) = @each($items)) {
меняем на
PHP:
foreach($items as $i => $curr_item) {

Файлы, в которых нужна замена:
Скрытое содержимое доступно для зарегистрированных пользователей!
 
Сверху Снизу