PHP 8.4 OPcache вызывает неправильные внутренние функции — round() становится sin(), file_get_contents() становится unliPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP 8.4 OPcache вызывает неправильные внутренние функции — round() становится sin(), file_get_contents() становится unli

Сообщение Anonymous »

Недавно мы установили новый сервер в RunCloud с PHP 8.4.16 (NTS) + Zend OPcache v8.4.16, JIT отключен. Мы запускаем приложение Yii2. С момента установки мы сталкиваемся со случайными исключениями TypeError и ArgumentCountError, ссылающимися на внутренние функции PHP, которых нет нигде в нашей кодовой базе. Ошибки меняются между запросами без промежуточного развертывания кода.

Код: Выделить всё

Confirmed environment:

PHP 8.4.16 (cli) (built: Jan 19 2026 03:54:38) (NTS) Zend Engine v4.4.16 Zend OPcache v8.4.16 JIT: disabled (opcache.jit=disable)
Обнаружены ошибки:

Код: Выделить всё

Function in code     Function PHP calls       ErrorFeb
array_map()          array_count_values()     ArgumentCountError: array_count_values() expects exactly 1 argument, 2 given

array_map()          array_all()              TypeError: array_all(): Argument #1 ($array) must be of type array, Closure given

round()              sin()                    ArgumentCountError: sin() expects exactly 1 argument, 2 given

file_get_contents()  unlink()                 ErrorException: unlink(...schema.ser): No such file or  directory
Ключевые детали:
  • Ни одна из «вызываемых» функций (array_count_values, array_all, sin, unlink) не существует где-либо в нашей кодовой базе.
  • Фактические исходные файлы содержат array_map, round и file_get_contents в сообщаемых строках.
  • Между ошибками код не был развернут — один и тот же код работал один день, а на следующий сломался.
  • Каждый раз появляется другая неправильная функция, всегда другая внутренняя функция PHP.
  • Обмен file_get_contents() → unlink() является разрушительным: он удаляет файл поставщика (schema.ser) вместо его чтения
  • Подтверждено, что JIT отключен; это чистое кэширование байт-кода OPcache
  • Перезапуск PHP-FPM временно исправляет ситуацию, но ошибки возвращаются
**

Пример — фактический источник (строка 111 файла InvoiceTotals.php):**

Код: Выделить всё

$item->taxAmount = round($item->taxAmount, $inv->getDecimals('invoice/taxAmount'));
Выдана ошибка:

Код: Выделить всё

ArgumentCountError: sin() expects exactly 1 argument, 2 given in .../InvoiceTotals.php:111
php, opcache, php-8.4, yii2

Похоже, OPcache разрешает неверные указатели функций из внутренней таблицы функций PHP во время компиляции байт-кода или извлечения из кэша. Кто-нибудь сталкивался с этим с PHP 8.4 + OPcache? Это известная ошибка или это может быть связано с повреждением памяти на сервере?

Подробнее здесь: https://stackoverflow.com/questions/798 ... sin-file-g
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»