Недоступен сайт у некоторых покупателей после обновления на 4.18.4

Коллеги, приветствую!

Обновился на 4.18.4 в выходные, сегодня уже два человека написали, что у них не работает сайт

Получилось добыть код ошибки

TypeError

Message
Argument 1 passed to MaxMind\Db\Reader::get() must be of the type string, null given, called in /home/tdspiter/public_html/app/functions/fn.locations.php on line 764

Error at
app/lib/vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php, line: 124

Backtrace
File:app/functions/fn.locations.php
Line:764
Function:get

File:app/functions/fn.init.php
Line:1474
Function:fn_get_country_by_ip

File:app/functions/fn.init.php
Line:1234
Function:fn_init_redirect_to_regional_storefront

File:init.php
Line:196
Function:fn_init

File:index.php
Line:18
Function:require

Как понимаю, что-то с геолокацией связано

Сталкивался кто с таким?

Собственно, по адресу app/lib/vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php, line: 124 вот эта функция получения ip-адреса

public function get(string $ipAddress)
{
if (\func_num_args() !== 1) {
throw new \ArgumentCountError(
sprintf(‘%s() expects exactly 1 parameter, %d given’, METHOD, \func_num_args())
);
}
[$record] = $this->getWithPrefixLen($ipAddress);

    return $record;
}

в 4.17.2 было так:

 public function get($ipAddress)
    {
        if (\func_num_args() !== 1) {
            throw new InvalidArgumentException(
                'Method takes exactly one argument.'
            );
        }
        list($record) = $this->getWithPrefixLen($ipAddress);

        return $record;
    }`Текст «как есть» (без применения форматирования)`

если попробовать заменить то заведется?

увы, не завелось

причем у человека работает второй магазин, а основной не грузится

проследите откуда аргумент приходит, пишет что null вместо ip адреса передается в функцию

Собственно, тут /home/tdspiter/public_html/app/functions/fn.locations.php on line 764 сидит эта функция

function fn_get_country_by_ip($ip)
{
static $cached_ips = ;

if (isset($cached_ips[$ip])) {
    return $cached_ips[$ip];
}

$code = '';

try {
    static $reader = null;

    if ($reader === null) {
        $reader = new Reader(Registry::get('config.dir.lib') . 'other/maxmind/GeoLite2-Country.mmdb');
    }

    $geo_data = $reader->get(long2ip($ip));
    $code = !empty($geo_data['country']['iso_code'])
        ? $geo_data['country']['iso_code']
        : '';
} catch (Exception $e) {
}

if (!$code && function_exists('geoip_country_code_by_name')) {
    $code = @geoip_country_code_by_name(long2ip($ip));
    $code = !empty($code) ? $code : '';
}

$cached_ips[$ip] = $code;

return $code;

}

764 это $geo_data = $reader->get(long2ip($ip));

то есть $reader не может получить $ip, правильно я понимаю?

посмотрите что приходит в функцию и что выходит

fn_log_event("general", "runtime", ['message' => $ip]);
$geo_data = $reader->get(long2ip($ip));
fn_log_event("general", "runtime", ['message' => $geo_data]);

результат - в журнале событий, или в таблице logs
PS малость поправил, давно этим пользовался, подзабыл

PS малость поправил, давно этим пользовался, подзабыл

Через логи не пишет ничего почему-то, вывел через fn_print_r

Попробовал сам зайти с и без впн, все работает

И получилось попросить покупателя с проблемой зайти на основной сайт на 4.18.4

И на тестовый на 4.17.2

И почему-то геоданные не дает получить нигде с ее ip-адресом, но при этом на 4.17.2 это не мешает работе сайта

похоже на какой-то баг ядре, так как функции одинаковые в двух установках, пойду в хелпдеск постучусь что ли

почему-то сразу не сообразил, но попросил в офисе людей проверить проблему

у 2/3 с такой же ошибкой сайт отваливается, причем и на ios, и на android, и в разных браузерах

но это только на мобильном интернете, на вайфае все работает

а вторая витрина работает у всех без ошибок, потому что там функция fn_get_country_by_ip вообще не фигурирует, тестовые данные не выводятся, как на основной

не может это быть от провайдера тырнета проблема? с этими их блокировками всякими сейчас

и может кто подскажет, возможно ли это дело где-то местами закомментить, чтобы сайт нормально работать стал?

а вы после обновления выключали старый модуль города и включали новый?

он там один вроде, что на 4.17.2, что на 4.18.4

а, это на 4.19.1 модуль города устарел. у меня боевой тоже пока на 4.18.4 работает. смотрите сторонние модули, которые работают с геолокацией.

Проблема оказалась в старой х32 системе на сервере, так что если кто-то решит обновляться с 4.17.2, имейте это ввиду

Из документации PHP:

Замечание: На 32-битных архитектурах приведение целочисленных представлений IP-адресов из строки (string) в целое число (int) не даст правильных результатов для чисел, которые превышают значение константы PHP_INT_MAX.

В поддержка ответили:

В 4.18.1, в рамках добавления поддержки PHP 8.2, были обновлены используемые сторонние библиотеки, в том числе библиотека maxmind-db/reader, в методах которой появилась строгая типизация для параметров. И если раньше, переданный параметр неправильного типа, молча неправильно обрабатывался, то теперь такая ситуация вызывает ошибку.

Операционная система с такой разрядностью сильно ограничена в максимальном количестве доступных ресурсов, в связи с архитектурными ограничениями. Использование данной устаревшей архитектуры в настоящее время нецелесообразно и может вызвать проблемы в неожиданных местах, когда, например, появятся значения идентификаторов (чего угодно), более чем 2147483647

1 лайк

Добрый день!
Расскажите пожалуйста, удалось обновиться?
На что обратить внимание при переходен на 19 версию?

Добрый день, я пока что на 4.18.4, на нее дало спокойно обновиться

Проблема со старой системой х32 вскрылась уже после обновления, когда началась рабочая неделе, и менеджеры стали присылать жалобы (обновлял на выходных магазин)

Для 4.19 нужно, как минимум, иметь свежую систему х64 на сервере и подходящую версию php