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)
Обнаруженные ошибки:
Функция в коде Функция PHP вызывает ErrorFeb

array_map() array_count_values() ArgumentCountError: array_count_values() ожидает ровно 1 аргумент, задано 2
array_map() array_all() TypeError: array_all(): Аргумент №1 ($array) должен иметь тип массива, Замыкание дано
round() sin() ArgumentCountError: sin() ожидает ровно 1 аргумент, задано 2
file_get_contents() unlink() ErrorException: unlink(...schema.ser): такого файла или каталога нет
Ключевые детали:
  • Ни одна из «вызываемых» функций (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»