!is_string($line) || trim($line) === '')) throw new RuntimeException('Некорректный согласованный источник requisites'); if (($config['requisites'] ?? null) === $expected) { echo "requisites актуальны: конфиг не изменён\n"; exit(0); } $patched = replaceRequisites($raw, json_encode($expected, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR)); $actual = json_decode($patched, true, 512, JSON_THROW_ON_ERROR); $config['requisites'] = $expected; // JSON-порядок ключей не меняет контракт, остальные значения должны совпасть. if ($actual != $config) throw new RuntimeException('Изменились несогласованные поля'); if (file_put_contents($path, $patched, LOCK_EX) === false) throw new RuntimeException('Запись config не удалась'); echo "Изменён только requisites по решению владельца preland#11\n"; exit(10); } catch (Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(2); }