Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 108 · Практика

RAR: прочитать, проверить и получить документы

Полный RAR API, обе формы вызова, установка, ограничения, реальные архивы/пароли/тома и безопасная выдача.

Первый результат: текст чека из RAR

Нужно получить чек из присланного RAR. Расширение rar умеет читать и извлекать готовые архивы; создавать RAR оно не умеет. В ZIP урока уже лежит настоящий input/orders.rar и исходные receipt.txt/notice.txt. Ничего искать или скачивать для учебных данных не требуется.

RarArchive::open выбирает контейнер; :: вызывает статический метод класса. getEntry("receipt.txt") выбирает запись внутри него; -> вызывает метод объекта. getStream открывает поток распаковки, stream_get_contents читает текст, echo выводит его, fclose закрывает поток. Наличие контейнера не означает наличие обычного файла receipt.txt рядом с PHP-скриптом.

Где находится документ
  1. input/orders.rar — настоящий внешний контейнер
  2. receipt.txt — внутреннее имя
  3. getStream — поток его распакованных байтов
  4. echo — чек на экране; extract — отдельная операция записи
Прочитать известный учебный чекСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/orders.rar');
if ($archive === false) { throw new RuntimeException('Нет архива'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$stream = $entry->getStream();
if ($stream === false) { throw new RuntimeException('Нет потока'); }
echo stream_get_contents($stream);
fclose($stream);
$archive->close();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Это первый шаг на собственном маленьком входе. Для чужого файла ниже добавлены лимит, проверка фактической длины/CRC и обработка ошибок. support.php сначала проверяет наличие расширения и включает RarException; все файлы приложены.

Окружение, настоящие исходники и общий читатель

Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

Команда проверки: php --ri rar. Если расширения нет, пример прекращает работу с сообщением, а не пытается использовать несуществующий класс. Windows DLL должна совпадать с версией PHP, x64/x86 и TS/NTS; наличие файла в папке само по себе не означает загрузку. PHP --ini показывает конфигурацию именно выбранного интерпретатора.

ВходСодержимое
input/receipt.txt
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
input/notice.txt
Получить заказ в пункте № 3.
input/orders.rarТе же два UTF-8 файла в указанном порядке, RAR5, без сжатия; это упрощает первое чтение. solid.rar показывает реальное сжатие.

Отправитель создал архив официальной RAR CLI из собственной папки input командой rar a -ma5 -md1m -m0 -ds orders.rar receipt.txt notice.txt. Для solid-сценария: rar a -ma5 -md1m -m3 -s -ds solid.rar receipt.txt notice.txt. -ma5 выбирает формат RAR5, -md1m ограничивает словарь, -m0 хранит без сжатия, -m3 сжимает, -s включает solid, -ds сохраняет порядок. Лицензия программы RAR относится к её использованию отдельно; PHP rar не заменяет этот инструмент создания. Все готовые архивы включены в ZIP, запуск RAR читателю для чтения не нужен.

support.php ниже вводит функцию readDocument: она принимает одну запись и необязательный пароль; после ограниченного чтения сравнивает реальный размер и CRC. Тип string обещает текстовый результат, а исключение прерывает неуспешный путь. null означает отсутствие явно переданного пароля. finally освобождает поток при любом исходе. CRC — проверка повреждения, не проверка авторства.

Что делает вызов readDocument($entry)
  1. $entry из getEntry("receipt.txt") передаётся локальному параметру $entry функции
  2. getStream открывает байты этой записи; $text получает прочитанный текст
  3. Размер61байт и CRC проверяются для обычного учебного файла
  4. return $text возвращает строку в echo readDocument($entry); затем продолжается код вызывающего

Этот небольшой helper рассчитан на записи с обычным CRC, как наш незашифрованный orders.rar. У зашифрованного RAR5 контрольная сумма может быть преобразована ключом; отдельный парольный сценарий использует extract и независимый оригинал. Универсальным проверяющим для любого RAR этот helper не является.

<?php
if (!extension_loaded('rar')) {
    fwrite(STDERR, "Нужен модуль rar для этого PHP. Проверьте php --ri rar и совпадение версии/архитектуры DLL.\n");
    exit(78);
}
RarException::setUsingExceptions(true);
function readDocument(RarEntry $entry, ?string $password = null): string {
    if ($entry->isDirectory() || $entry->getUnpackedSize() > 1024) {
        throw new RuntimeException('Нужен документ не больше 1024 байт');
    }
    $stream = $password === null ? $entry->getStream() : $entry->getStream($password);
    if ($stream === false) { throw new RuntimeException('Не удалось открыть запись'); }
    try { $text = stream_get_contents($stream, 1025); }
    finally { fclose($stream); }
    if ($text === false || strlen($text) !== $entry->getUnpackedSize() || strlen($text) > 1024) {
        throw new RuntimeException('Неполный документ или превышение лимита');
    }
    $crc = str_pad(strtolower($entry->getCrc()), 8, '0', STR_PAD_LEFT);
    if (!hash_equals($crc, hash('crc32b', $text))) {
        throw new RuntimeException('Контрольная сумма не совпала');
    }
    return $text;
}

bootstrap.php использует этот helper, открывает input/orders.rar и создаёт переменную $archive:

<?php
require __DIR__ . '/support.php';
$path = __DIR__ . '/input/orders.rar';
$archive = RarArchive::open($path);
if ($archive === false) { throw new RuntimeException('Не удалось открыть поставку'); }

Полный приём: документы, проверка и сохранение

Задача получателя — сохранить два проверенных документа вне web root. Собственная схема допускает ровно receipt.txt и notice.txt, обычные незашифрованные Unix-файлы, каждый до1024байт; весь контейнер до32КиБ. Другие схемы должны сознательно определить собственную политику, а не ослаблять эти проверки наугад.

Сначала весь маленький набор читается и проверяется в памяти; только потом mkdir создаёт новую приватную папку. foreach использует два фиксированных имени, а xb отказывает при существующем файле. Если запись не завершилась, catch удаляет только созданные этим вызовом файлы. Атрибуты/ACL/владельцы из архива не назначаются. Папка должна находиться под управлением приложения, без возможности подмены путей другим пользователем.

<?php
require __DIR__ . '/support.php';
function receiveRar(string $path, string $destination): void {
    if (!is_file($path)) { throw new RuntimeException('Нет файла поставки'); }
    $size = filesize($path);
    if ($size === false || $size > 32768) { throw new RuntimeException('Превышен размер входа'); }
    if (file_exists($destination) || is_link($destination)) { throw new RuntimeException('Папка результата уже занята'); }
    $archive = RarArchive::open($path);
    if ($archive === false) { throw new RuntimeException('Не открыт архив'); }
    $documents = [];
    try {
        if ($archive->isBroken()) { throw new RuntimeException('Поставка неполная'); }
        $entries = $archive->getEntries();
        if ($entries === false || count($entries) !== 2) { throw new RuntimeException('Нужны ровно два документа'); }
        foreach ($entries as $entry) {
            $name = $entry->getName();
            if (!in_array($name, ['receipt.txt', 'notice.txt'], true) || isset($documents[$name])) {
                throw new RuntimeException('Неожиданное или повторное имя');
            }
            if ($entry->getHostOs() !== RarEntry::HOST_UNIX || ($entry->getAttr() & 0170000) !== 0100000 || $entry->isEncrypted()) {
                throw new RuntimeException('Нужен обычный незашифрованный Unix-файл');
            }
            $documents[$name] = readDocument($entry);
        }
    } finally { $archive->close(); }
    if (!mkdir($destination, 0700)) { throw new RuntimeException('Не создана папка получателя'); }
    $created = [];
    try {
        foreach (['receipt.txt', 'notice.txt'] as $name) {
            $target = $destination . '/' . $name;
            $stream = fopen($target, 'xb');
            if ($stream === false) { throw new RuntimeException('Не создан документ'); }
            $created[] = $target;
            try {
                if (fwrite($stream, $documents[$name]) !== strlen($documents[$name])) { throw new RuntimeException('Неполная запись'); }
            } finally { fclose($stream); }
        }
    } catch (Throwable $error) {
        foreach ($created as $target) { unlink($target); }
        rmdir($destination);
        throw $error;
    }
}
RAR → новая папка получателя и понятные отказыСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/import.php';
receiveRar(__DIR__ . '/input/orders.rar', __DIR__ . '/received');
foreach (['receipt.txt', 'notice.txt'] as $name) { echo 'received/', $name, ":\n", file_get_contents(__DIR__ . '/received/' . $name); }
foreach (['wrong.rar', 'oversized.rar', 'bad-crc.rar', 'broken.rar', 'absent.rar'] as $name) {
    try { receiveRar(__DIR__ . '/input/' . $name, __DIR__ . '/rejected'); }
    catch (RarException $error) { echo $name, ": Архив не удалось прочитать\n"; }
    catch (RuntimeException $error) { echo $name, ': ', $error->getMessage(), "\n"; }
    if (file_exists(__DIR__ . '/rejected')) { throw new RuntimeException('Отказ оставил результат'); }
}
try { receiveRar(__DIR__ . '/input/orders.rar', __DIR__ . '/received'); }
catch (RuntimeException $error) { echo 'Повторная поставка: ', $error->getMessage(), "\n"; }
echo "Ранее сохранённый чек:\n", file_get_contents(__DIR__ . '/received/receipt.txt');
Ожидаемый результат
received/receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
received/notice.txt:
Получить заказ в пункте № 3.
wrong.rar: Неожиданное или повторное имя
oversized.rar: Нужен документ не больше 1024 байт
bad-crc.rar: Контрольная сумма не совпала
broken.rar: Архив не удалось прочитать
absent.rar: Нет файла поставки
Повторная поставка: Папка результата уже занята
Ранее сохранённый чек:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Входы wrong/oversized/bad-crc/broken приложены: проверяются неверное имя, превышение1024байт, подмена300на900при старойCRC и неправильный контейнер. Открытие/декодер сам может расходовать ресурсы до нашей проверки: нужны внешние квоты времени/памяти и доверенный источник, особенно для solid/encrypted. CRC из самого архива не удостоверяет отправителя.

Пароль: скрытые имена и содержимое документа

Пароль заголовков скрывает имена: без него нельзя начать список. Пароль отдельной записи может требоваться позже, когда имена уже видны. Ниже два независимых входа headers.rar и encrypted.rar с публичным учебным паролем Lesson42.

Неверный пароль и два правильных пути чтенияСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
try { $wrong = RarArchive::open(__DIR__ . '/input/headers.rar', 'wrong'); if ($wrong !== false) { try { $wrong->getEntries(); } finally { $wrong->close(); } } }
catch (RarException $error) { echo "Неверный пароль заголовков: имена не получены\n"; }
$archive = RarArchive::open(__DIR__ . '/input/headers.rar', 'Lesson42');
if ($archive === false) { throw new RuntimeException('Не открыт защищённый вход'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
$archive = RarArchive::open(__DIR__ . '/input/encrypted.rar');
if ($archive === false) { throw new RuntimeException('Не открыт второй вход'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$wrongPath = __DIR__ . '/wrong-receipt.txt';
try { if (!$entry->extract('', $wrongPath, 'wrong', false)) { throw new RuntimeException('Неверный пароль'); } }
catch (RarException | RuntimeException $error) { echo "Неверный пароль записи: документ не выдан\n"; }
finally { if (is_file($wrongPath)) { unlink($wrongPath); } }
$target = __DIR__ . '/protected-receipt.txt';
if (!$entry->extract('', $target, 'Lesson42', false)) { throw new RuntimeException('Не извлечён чек'); }
$text = file_get_contents($target);
if ($text !== file_get_contents(__DIR__ . '/input/receipt.txt')) { throw new RuntimeException('Не совпал исходный документ'); }
echo $text;
$archive->close();
Ожидаемый результат
Неверный пароль заголовков: имена не получены
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Неверный пароль записи: документ не выдан
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

getStream в некоторых вариантах RAR возвращает неправильные байты вместо отказа при неверном пароле. Для зашифрованных записей RAR5 CRC может быть преобразована ключом, поэтому getCrc не всегда сравнима с простым crc32b; для второго входа используем проверку extract и независимый оригинал. Неполный файл ошибочной попытки удаляется из собственной временной папки. Поэтому readDocument проверяет длину и CRC до echo. Для этой DLL читается ровно заранее ограниченный размер записи, чтобы не получить padding при чтении за конец. Неверный пароль заголовков обнаруживается при первом getEntries: open может отложить чтение заголовков. Факт наличия шифрования не означает, что чтение уже успешно.

Многотомная поставка: от первого тома до полного текста

Набор multi.part01.rar…multi.part06.rar содержит полный чек и большой дополнительный текст. Начинать нужно с первого тома. Первый том в ZIP назван routed.part01.rar: ожидаемый routed.part02.rar отсутствует, callback сопоставляет его с настоящим multi.part02.rar. Разрешаем только эти шесть заранее известных локальных частей; неизвестный запрос возвращает null и не запускает бесконечный поиск.

Все тома → чек и полное приложениеСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$allowed = ['multi.part01.rar', 'multi.part02.rar', 'multi.part03.rar', 'multi.part04.rar', 'multi.part05.rar', 'multi.part06.rar'];
$findVolume = static function (string $missing) use ($allowed): ?string {
    $name = str_replace('routed.', 'multi.', basename($missing));
    if (!in_array($name, $allowed, true)) { return null; }
    $path = __DIR__ . '/input/' . $name;
    return is_file($path) ? $path : null;
};
$archive = RarArchive::open(__DIR__ . '/input/routed.part01.rar', null, $findVolume);
if ($archive === false || $archive->isBroken()) { throw new RuntimeException('Не получен весь набор'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$entry = $archive->getEntry('large.txt');
if ($entry === false) { throw new RuntimeException('Не получено приложение'); }
$stream = $entry->getStream();
if ($stream === false) { throw new RuntimeException('Нет потока приложения'); }
try { $text = stream_get_contents($stream, 4481); }
finally { fclose($stream); }
if ($text !== file_get_contents(__DIR__ . '/input/large.txt')) { throw new RuntimeException('Тома не дали полный текст'); }
file_put_contents(__DIR__ . '/attachment.txt', $text);
echo "Все тома прочитаны; attachment.txt содержит 160 строк: Attachment for delivery 42.\n";
$archive->close();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Все тома прочитаны; attachment.txt содержит 160 строк: Attachment for delivery 42.

Большой файл сравнивается целиком с собственным эталоном input/large.txt; сообщение о160строках подтверждается байтовым сравнением, а не выводится вместо чтения. Имена callback ограничены локальным списком. Для реального внешнего набора задайте полный договор имён и квот.

Следующий шаг: выдать другой документ

Упражнение: вместо чека выдайте человеку памятку notice.txt и завершите чтение контейнера. Сначала предскажите, какой аргумент надо изменить и какие строки появятся. Не переименовывайте файл RAR: меняется только выбранная запись.

Решение: другой документ того же заказаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('notice.txt');
if ($entry === false) { throw new RuntimeException('Памятка не приложена'); }
echo "Памятка покупателю:\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Памятка покупателю:
Получить заказ в пункте № 3.

Внешний путь input/orders.rar прежний. getEntry получил другое внутреннее имя; тот же читатель проверил другую запись и вернул её текст. Если добавить в архив акт, сначала определите его имя/размер/тип в договоре получателя; не расширяйте allowlist просто ради отсутствия ошибки.

Скачать чек: настоящий локальный HTTP-запрос

Получателю нужен файл по кнопке скачивания. Сначала сервер полностью проверяет маленький чек; только затем отправляет заголовки загрузки. Это позволяет вернуть ошибку до начала тела ответа. Идентификатор receipt выбирается из нашей схемы, не превращается в путь к файлу.

Распакуйте ZIP и запустите php -S 127.0.0.1:8781 с совместимым rar. Адрес: http://127.0.0.1:8781/example.php?document=receipt. Content-Type задаёт текст UTF-8, Content-Disposition предлагает имя receipt.txt, Content-Length сообщает длину в байтах. HEAD возвращает те же заголовки без тела. Неизвестный идентификатор получает404.

Локальный запрос → проверенный RAR-документ → HTTP-ответПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
if (($_GET['document'] ?? null) !== 'receipt') {
    http_response_code(404);
    header('Content-Type: text/plain; charset=UTF-8');
    echo "Документ не найден\n";
    exit;
}
try {
    $archive = RarArchive::open(__DIR__ . '/input/orders.rar');
    if ($archive === false) { throw new RuntimeException('Нет архива'); }
    try {
        $entry = $archive->getEntry('receipt.txt');
        if ($entry === false) { throw new RuntimeException('Нет чека'); }
        $text = readDocument($entry);
    } finally { $archive->close(); }
} catch (RarException | RuntimeException $error) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=UTF-8');
    echo "Не удалось подготовить документ\n";
    exit;
}
header('Content-Type: text/plain; charset=UTF-8');
header('Content-Disposition: attachment; filename="receipt.txt"');
header('Content-Length: ' . strlen($text));
if ($_SERVER['REQUEST_METHOD'] !== 'HEAD') { echo $text; }
Ожидаемый результат
GET receipt: HTTP 200, text/plain; charset=UTF-8, attachment; filename="receipt.txt", Content-Length: 61
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
HEAD receipt: HTTP 200, Content-Length: 61, тело пустое
GET unknown: HTTP 404
Документ не найден

Это фактический localhost runtime, отдельно от lint. Сервер отдаёт только собственный небольшой документ. Для больших файлов нужна иная схема staging/проверки до выдачи: после отправки части тела уже нельзя заменить ответ честным статусом500. Поддержка старых браузеров из исторического примера не требует угадывать User-Agent для нашего ASCII-имени.

Назначение RAR: принять и прочитать

Модуль использует UnRAR для чтения, не создаёт RAR. Готовый контейнер поступает из другого инструмента; наши исходные документы и созданные из них архивы приложены. Для самостоятельной PHP-записи есть ZipArchive и PharData.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Архивирование Rar

Введение

Rar - это мощный и эффективный архиватор, созданный Евгением Рошалем. Данный модуль позволяет читать Rar-архивы, однако не даёт возможности их записывать, так как эта операция не поддерживается библиотекой UnRar и напрямую запрещена условиями её лицензии.

Больше информации о Rar и UnRar можно найти здесь: » http://www.rarlabs.com/.

Окружение перед первым запуском

Нужен именно rar, совместимый с вашим PHP. Файл с расширением .rar не превращает ZipArchive в RAR-декодер. CLI и веб-сервер могут запускать разные PHP/ini.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Установка и настройка

Содержание

Установка и совместимость

Официальная установка описывает PECL/phpize и Windows DLL. Совместимость с конкретной версией PHP надо проверять отдельно; номер PECL-релиза сам по себе её не гарантирует. Наш отдельный 8.3 runtime и его startup warnings обозначены явно; основной8.5 не изменён.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Установка

Модуль Rar доступен в репозитории PECL: » https://pecl.php.net/package/rar.

Можно также воспользоваться установщиком PECL, чтобы установить модуль Rar. Для этого необходимо использовать команду: pecl -v install rar.

Можно также скачать архив tar.gz и установить Rar вручную:

Пользователям ОС Windows необходимо включить модуль php_rar.dll в файле php.ini.

Контейнер, запись и поток

RarArchive и RarEntry — объекты; getStream даёт ресурс. Исторический заголовок «ресурсы» не означает, что is_resource($archive) является правильной современной проверкой. После close объект записи недействителен, ранее открытый поток остаётся независимым.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Типы ресурсов

Этот модуль использует три внутренних ресурса: дескриптор файла, который возвращает функция rar_open() — RarArchive, содержимое архива, которое возвращают функции rar_list() и rar_entry_get() – RarEntry и тип исключений RarException.

Модуль также регистрирует потоковый ресурс с названием «rar» и URL-обёртку с названием «rar wrapper» и префиксом «rar», который соответствует обёртке.

Константы ОС и атрибутов

HOST_UNIX выбирает трактовку Unix-битов, ATTRIBUTE_UNIX_REGULAR_FILE — тип обычного файла. Windows-атрибуты означают другое. Старые глобальные RAR_HOST_* сохранены для совместимости; новый код использует константы RarEntry.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Предопределённые константы

Следующие константы определяются модулем и доступны, только если модуль либо собрали в PHP, либо динамически загрузили при выполнении кода.

RAR_HOST_MSDOS (int)

Используйте вместо неё константу RarEntry::HOST_MSDOS.

RAR_HOST_OS2 (int)

Используйте вместо неё константу RarEntry::HOST_OS2.

RAR_HOST_WIN32 (int)

Используйте вместо неё константу RarEntry::HOST_WIN32.

RAR_HOST_UNIX (int)

Используйте вместо неё константу RarEntry::HOST_UNIX.

RAR_HOST_BEOS (int)

Используйте вместо неё константу RarEntry::HOST_BEOS.

Два полных сценария вместо неизвестного example.rar

Сценарий извлечения выше заканчивается настоящими received/receipt.txt и notice.txt. Сценарий localhost выдаёт тот же чек с корректными HTTP-заголовками, HEAD и404. Все входы известны, подготовка и ошибки видимы.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Примеры

Смотрите также примеры по ссылке обёртка rar://.

Этот пример открывает RAR-файл и предоставляет запрошенный файл вне RAR-архива для загрузки клиентом.

Этот пример открывает RAR-файл и извлекает каждый объект в заданную директорию.

Функции, методы и процедурные формы

Основной API находится в трёх классах. Восемь процедурных форм используют тот же объект контейнера, например rar_list($archive) соответствует $archive->getEntries(). rar_wrapper_cache_stats — диагностика обёртки, не распаковщик.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Rar

Содержание

RarArchive: весь контейнер и его тома

open создаёт объект без new RarArchive; он предоставляет записи и признаки контейнера. foreach обходит объекты RarEntry, getEntry выбирает первое совпадающее имя. Полный набор томов нужен для полного результата.

Показать законченный сценарий

В PECL rar 4.2.0 на PHP 8 добавлен IteratorAggregate. Старый обзор с Traversable сохраняет доступные методы; практический foreach и доступ по числовому индексу разобраны отдельно.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Класс RarArchive

(PECL rar >= 2.0.0)

Введение

Этот класс описывает RAR архив, который может состоять из нескольких томов (частей) и содержать некоторое число RAR записей (файлы, директории и другие специальные объекты, такие как символические ссылки).

Объекты этого класса могут быть заполнены перебором исходя из записей, хранящихся в соответствующем RAR архиве. Эти записи могут быть также получены с помощью методов RarArchive::getEntry() и RarArchive::getEntries().

Обзор класса

final class RarArchive implements Traversable {
/* Методы */
public function close(): bool
public function getComment(): string
public function getEntries(): array|false
public function getEntry(string $entryname): RarEntry|false
public function isBroken(): bool
public function isSolid(): bool
public static function open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
public function setAllowBroken(bool $allow_broken): bool
public function __toString(): string
}

Содержание

RarEntry: одна запись и все её атрибуты

Экземпляр получают из открытого архива. Он хранит имя, размеры, метод, CRC, исходную ОС и её атрибуты. isDirectory=false не исключает символическую ссылку; полный официальный список битов ниже нужен для точного решения.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Класс RarEntry

(PECL rar >= 0.1)

Введение

Запись RAR, представляющая директорию или сжатый файл внутри архива RAR.

Обзор класса

final class RarEntry {
/* Константы */
const int HOST_MSDOS = 0;
const int HOST_OS2 = 1;
const int HOST_WIN32 = 2;
const int HOST_UNIX = 3;
const int HOST_MACOS = 4;
const int HOST_BEOS = 5;
const int ATTRIBUTE_WIN_VIRTUAL = 65536;
const int ATTRIBUTE_UNIX_FIFO = 4096;
const int ATTRIBUTE_UNIX_SOCKET = 49152;
/* Методы */
public function extract(
    string $dir,
    string $filepath = "",
    string $password = NULL,
    bool $extended_data = false
): bool
public function getAttr(): int
public function getCrc(): string
public function getFileTime(): string
public function getHostOs(): int
public function getMethod(): int
public function getName(): string
public function getPackedSize(): int
public function getStream(string $password = ?): resource|false
public function getUnpackedSize(): int
public function getVersion(): int
public function isDirectory(): bool
public function isEncrypted(): bool
public function __toString(): string
}

Предопределённые константы

RarEntry::HOST_MSDOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в MS-DOS. Введена для замены RAR_HOST_MSDOS.

RarEntry::HOST_OS2

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в OS/2. Введена для замены RAR_HOST_OS2.

RarEntry::HOST_WIN32

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в Microsoft Windows. Введена для замены RAR_HOST_WIN32.

RarEntry::HOST_UNIX

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в UNIX. Введена для замены RAR_HOST_UNIX.

RarEntry::HOST_MACOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в Mac OS.

RarEntry::HOST_BEOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в BeOS. Введена для замены RAR_HOST_BEOS.

RarEntry::ATTRIBUTE_WIN_READONLY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "read-only" для записей Windows.

RarEntry::ATTRIBUTE_WIN_HIDDEN

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "hidden" для записей Windows.

RarEntry::ATTRIBUTE_WIN_SYSTEM

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "system" для записей Windows.

RarEntry::ATTRIBUTE_WIN_DIRECTORY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "directory" (является директорией) для записей Windows. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями, добавленными не через WinRAR.

RarEntry::ATTRIBUTE_WIN_ARCHIVE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "archive" для записей Windows.

RarEntry::ATTRIBUTE_WIN_DEVICE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "device" для записей Windows.

RarEntry::ATTRIBUTE_WIN_NORMAL

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "normal file" (НЕ является директорией) для записей Windows. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями, добавленными не через WinRAR.

RarEntry::ATTRIBUTE_WIN_TEMPORARY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "temporary" для записей Windows.

RarEntry::ATTRIBUTE_WIN_SPARSE_FILE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "sparse file" (разреженный файл NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_REPARSE_POINT

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "reparse point" (файл точки повторной обработки NTFS, т.е. пересечение директорий или точка монтирования файловой системы) для записей Windows.

RarEntry::ATTRIBUTE_WIN_COMPRESSED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "compressed" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_OFFLINE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "offline" (запись отключена и недоступна) для записей Windows.

RarEntry::ATTRIBUTE_WIN_NOT_CONTENT_INDEXED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "not content indexed" (запись должна быть проиндексирована) для записей Windows.

RarEntry::ATTRIBUTE_WIN_ENCRYPTED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "encrypted" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_VIRTUAL

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "virtual" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_UNIX_WORLD_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_WORLD_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_WORLD_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_STICKY

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "sticky bit" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_SETGID

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "setgid" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_SETUID

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "setuid" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET

Маска для изоляции четырёх последних бит (полубайт) для атрибутов UNIX (_S_IFMT, тип файловой маски). Используется с RarEntry::getAttr() и константами RarEntry::ATTRIBUTE_UNIX_FIFO, RarEntry::ATTRIBUTE_UNIX_CHAR_DEV, RarEntry::ATTRIBUTE_UNIX_DIRECTORY, RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV, RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE, RarEntry::ATTRIBUTE_UNIX_SYM_LINK и RarEntry::ATTRIBUTE_UNIX_SOCKET.

RarEntry::ATTRIBUTE_UNIX_FIFO

Специальные файлы FIFO в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_CHAR_DEV

Специальные файлы символьных устройств в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_DIRECTORY

Директории в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями добавленными в других операционных системах.

RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV

Специальные файлы блочных устройств в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE

Обычные файлы (не директории) в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями добавленными в других операционных системах.

Символические ссылки в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_SOCKET

Специальные файлы сокетов в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

Содержание

RarException: режим и причина ошибки

Класс одновременно настраивает исключения и обозначает ошибки модуля. Код и сообщение помогают журналу; пользователю сообщают понятное действие. Коды библиотечных ошибок и обычные унаследованные методы Exception полностью сохранены ниже.

Показать законченный сценарий

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Класс RarException

(PECL rar >= 2.0.0)

Введение

Класс служит двум целям: это тип исключений, передаваемых функциями и методами модуля RAR, позволяющий с помощью стандартных методов производить запрос и определять ошибку работы модуля независимо от того, передаются ли исключения или лишь выдаются предупреждения.

Используются следующие коды ошибок:

  • -1 - ошибка вне библиотеки UnRAR

  • 11 - недостаточно памяти

  • 12 - неправильные данные

  • 13 - неправильный архив

  • 14 - неизвестный формат

  • 15 - ошибка открытия файла

  • 16 - ошибка создания файла

  • 17 - ошибка закрытия файла

  • 18 - ошибка чтения

  • 19 - ошибка записи

  • 20 - слишком маленький буфер

  • 21 - неизвестная ошибка RAR

  • 22 - требуется пароль

Обзор класса

final class RarException extends Exception {
/* Методы */
public static function isUsingExceptions(): bool
public static function setUsingExceptions(bool $using_exceptions): void
/* Наследуемые методы */
final public function Exception::getMessage(): string
final public function Exception::getPrevious(): ?Throwable
final public function Exception::getCode(): int
final public function Exception::getFile(): string
final public function Exception::getLine(): int
final public function Exception::getTrace(): array
final public function Exception::getTraceAsString(): string
public function Exception::__toString(): string
private function Exception::__clone(): void
}

Содержание

  • RarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения
  • RarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок

Процедурный стиль: тот же настоящий документ

Процедурные функции принимают тот же RarArchive, который возвращает rar_open. Здесь все восемь форм участвуют в понятном результате: открыть вход, прочитать комментарий/список/чек, проверить целостность набора, затем закрыть. Вызов setAllowBroken(false) сохраняет строгую политику приёма.

Восемь процедурных форм в одном получателеСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = rar_open(__DIR__ . '/input/orders.rar');
if ($archive === false) { throw new RuntimeException('Не открыт архив'); }
rar_allow_broken_set($archive, false);
if (rar_broken_is($archive)) { throw new RuntimeException('Нужны все части'); }
echo rar_solid_is($archive) ? "Читаем сплошную поставку\n" : "Читаем обычную поставку\n";
echo 'Комментарий: ', rar_comment_get($archive), "\n";
$entries = rar_list($archive);
if ($entries === false) { throw new RuntimeException('Нет перечня'); }
foreach ($entries as $entry) { echo 'Приложен ', $entry->getName(), "\n"; }
$entry = rar_entry_get($archive, 'receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
echo readDocument($entry);
rar_close($archive);
Ожидаемый результат
Читаем обычную поставку
Комментарий: Delivery 42: receipt and notice.

Приложен receipt.txt
Приложен notice.txt
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Параметры open — имя, пароль, callback; остальные функции получают объект первым аргументом. Это формы одного API, а не отдельный способ хранения файлов. Полные сигнатуры обеих форм доступны в каждой связанной карточке.

rar://: путь, каталоги и пароли контекста

Обёртка позволяет читать запись привычными потоковыми функциями. Формат: rar://<URL-кодированный путь архива>[*][#[<URL-кодированное имя записи>]]. Путь может быть абсолютным или относительным. Имя после# требует разделителя; ведущая / перед внутренним именем необязательна.

Без# и имени открывается корень контейнера, у которого нет отдельной записи с временем изменения. Для RecursiveDirectoryIterator корень должен заканчиваться# — иначе дочерние URL строятся неправильно. При обходе имена по умолчанию URL-кодированы; * возвращает их без кодирования. Это важно для имён, которые сами выглядят как %2F. Обёртка появляется с PECL rar3.0 и требует установленного модуля.

ВозможностьПравило
allow_url_fopen / allow_url_includeНе ограничивают эту локальную обёртку. Это не разрешение подключать чужой PHP-код.
Чтение / statПоддерживаются.
Запись / append / одновременное чтение-записьНе поддерживаются.
unlink / rename / mkdir / rmdirНе поддерживаются.
Параметр контекста rarСмысл
open_passwordПароль заголовков. Если заголовки зашифрованы, этот пароль используется для файлов, file_password игнорируется.
file_passwordПароль записи при незашифрованных заголовках. В таком архиве open_password игнорируется.
volume_callbackЛокальная функция поиска недостающего тома по правилам RarArchive::open.
Защищённый чек через rar:// и контекстСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$context = stream_context_create(['rar' => ['open_password' => 'Lesson42']]);
$url = 'rar://' . rawurlencode(__DIR__ . '/input/headers.rar') . '#' . rawurlencode('receipt.txt');
$stream = fopen($url, 'rb', false, $context);
if ($stream === false) { throw new RuntimeException('Нет защищённого потока'); }
try { $text = stream_get_contents($stream, 61); }
finally { fclose($stream); }
if ($text !== file_get_contents(__DIR__ . '/input/receipt.txt')) { throw new RuntimeException('Не получен исходный документ'); }
echo $text;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Контекст передаётся четвёртым аргументом fopen; третий false запрещает поиск include_path. Пример знает размер собственного чека61байт и сравнивает весь текст с независимым input-эталоном. Чтение за этот конец в проверенной rar4.2.0 возвращало padding; фиксированный61здесь относится только к приложенному входу, не к произвольному внешнему документу. Для внешнего документа вместо знания эталона нужны ограниченное чтение и доверенный договор целостности.

Первичный полный договор обёртки: PHP Manual: rar://. Чтение через обёртку не создаёт извлечённую папку; для сохранения двух документов используйте проект выше.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

RarArchive::openRarArchive::open -- rar_open — Открывает архив RAR

(PECL rar >= 2.0.0) · rar

public static function RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
function rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Открыть поставку и прочитать чек. open получает путь настоящего input/orders.rar. Результат — объект контейнера; содержимое выбранного документа читается отдельным шагом.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Открыть поставку и прочитать чекСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/orders.rar');
if ($archive === false) { throw new RuntimeException('Не открыт архив'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Вызов не извлекает все файлы автоматически и не создаёт новый RAR. null во втором/третьем аргументе означает отсутствие пароля/обработчика томов. Зашифрованные заголовки требуют пароля уже при open; отдельные документы могут иметь другие пароли.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public static function RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Процедурный стиль:

function rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Открывает указанный RAR-архив и возвращает объект RarArchive, представляющий его.

Замечание:

При открытии многотомного архива путь к первому тому должен быть передан первым параметром. Иначе не будут видны все файлы.

Список параметров

filename

Путь к архиву Rar.

password

Пароль, если необходимо расшифровать заголовки архива. Этот же пароль будет использоваться по умолчанию, если будут найдены зашифрованные файлы. Учтите, что файлы могут быть зашифрованы с разными паролями.

volume_callback

Функция, которой передаётся единственный параметр - путь к тому, который не был найден, и возвращающая строку с правильным путём для этого тома или null, если данный том не существует или неизвестен. Разработчик должен быть уверен, что данная функция не приведёт к зацикливанию, так как она вызывается повторно, если путь полученный предыдущим вызовом не соответствует нужному тому. Указание этого параметра устраняет предупреждения, которые появлялись бы, если бы том не был бы найден. В случае, если функция возвращает только null, то не будет ни одного предупреждения.

Внимание

До версии 2.0.0 эта функция не обрабатывала правильно относительные пути. В таких случаях используйте realpath().

Возвращаемые значения

Возвращает запрашиваемый объект RarArchive или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 3.0.0 Был добавлен volume_callback.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_openRarArchive::open -- rar_open — Открывает архив RAR

(PECL rar >= 2.0.0) · rar

function rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Процедурная форма RarArchive::open: первый аргумент — имя файла; далее необязательные пароль и функция поиска тома. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::open

ФормаИспользование
Методpublic static function RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
Процедурная функцияfunction rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
RarArchive::closeRarArchive::close -- rar_close — Закрывает RAR архив и освобождает все ресурсы

(PECL rar >= 2.0.0) · rar

public function RarArchive::close(): bool
function rar_close(RarArchive $rarfile): bool

Закрыть контейнер, сохранив уже открытый поток. Объект RarEntry нельзя использовать как прежде после close, но ранее открытый поток независим. Покажем текст после освобождения контейнера.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Закрыть контейнер, сохранив уже открытый потокСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$crc = str_pad(strtolower($entry->getCrc()), 8, '0', STR_PAD_LEFT);
$stream = $entry->getStream();
if ($stream === false) { throw new RuntimeException('Нет потока'); }
$archive->close();
try { $text = stream_get_contents($stream, 1025); }
finally { fclose($stream); }
if ($text === false || !hash_equals($crc, hash('crc32b', $text))) { throw new RuntimeException('Неполный чек'); }
echo "Контейнер закрыт; ранее открытый поток дал:\n", $text;
Ожидаемый результат
Контейнер закрыт; ранее открытый поток дал:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

CRC берётся до закрытия. После него не вызываем методы старого RarEntry. finally закрывает независимый поток даже при ошибке чтения; возвращаемый bool close сам по себе не является документом.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::close(): bool

Процедурный стиль:

function rar_close(RarArchive $rarfile): bool

Закрывает RAR архив и освобождает все ресурсы связанные с ним.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 2.0.0 Элементы архива, возвращаемые RarArchive::getEntry() и RarArchive::getEntries() теперь недействительны после вызова данного метода. Это означает, что нет гарантии правильной работы всех методов этих элементов.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_closeRarArchive::close -- rar_close — Закрывает RAR архив и освобождает все ресурсы

(PECL rar >= 2.0.0) · rar

function rar_close(RarArchive $rarfile): bool

Процедурная форма RarArchive::close: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::close

ФормаИспользование
Методpublic function RarArchive::close(): bool
Процедурная функцияfunction rar_close(RarArchive $rarfile): bool
RarArchive::getCommentRarArchive::getComment -- rar_comment_get — Получить текст комментария из архива RAR

(PECL rar >= 2.0.0) · rar

public function RarArchive::getComment(): string
function rar_comment_get(RarArchive $rarfile): string

Показать сопроводительную заметку и чек. Комментарий относится ко всему архиву. В нашем orders.rar он записан отправителем из comment.txt и поясняет состав поставки.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Показать сопроводительную заметку и чекСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$comment = $archive->getComment();
echo 'Комментарий: ', $comment ?? '(не приложен)', "\n";
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
Ожидаемый результат
Комментарий: Delivery 42: receipt and notice.

Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Для передачи в HTML комментарий экранируют htmlspecialchars. Комментарий — недоверенные данные отправителя, не доказательство правильного состава. Исторические RAR могли хранить комментарий в другой кодировке; общий лимит и версия формата разобраны в контракте.

Уточнение формата: старое замечание ниже о комментариях без Unicode относится к прежним вариантам RAR. В спецификации RAR5 комментарий — UTF-8 service header CMT. Наш ASCII-комментарий переносим между вариантами; кодировку произвольного старого архива нельзя угадывать.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::getComment(): string

Процедурный стиль:

function rar_comment_get(RarArchive $rarfile): string

Возвращает (глобальный) комментарий, сохранённый в архиве RAR. Он может быть длиной вплоть до 64 KiB.

Замечание:

Модуль не поддерживает комментарии на уровне записей.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает комментарий или null, если его нет.

Замечание:

RAR в текущий момент не поддерживает комментарии в unicode. Кодировка результата не определена, но, возможно, она будет Windows-1252.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_comment_getRarArchive::getComment -- rar_comment_get — Получить текст комментария из архива RAR

(PECL rar >= 2.0.0) · rar

function rar_comment_get(RarArchive $rarfile): string

Процедурная форма RarArchive::getComment: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::getComment

ФормаИспользование
Методpublic function RarArchive::getComment(): string
Процедурная функцияfunction rar_comment_get(RarArchive $rarfile): string
RarArchive::getEntriesRarArchive::getEntries -- rar_list — Возвращает полный список элементов из RAR архива

(PECL rar >= 2.0.0) · rar

public function RarArchive::getEntries(): array|false
function rar_list(RarArchive $rarfile): array|false

Показать все документы поставки. getEntries возвращает массив RarEntry. foreach получает каждый объект, getName выбирает подпись, readDocument возвращает проверенные байты.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Показать все документы поставкиСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entries = $archive->getEntries();
if ($entries === false) { throw new RuntimeException('Не прочитан перечень'); }
foreach ($entries as $entry) {
    if ($entry->isDirectory()) { continue; }
    echo $entry->getName(), ":\n", readDocument($entry);
}
$archive->close();
Ожидаемый результат
receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
notice.txt:
Получить заказ в пункте № 3.

Порядок зависит от архива, здесь он задан приложенным входом. Дубликаты имён не исчезают из списка; getEntry по имени выбрал бы только первый. Полный импорт ниже запрещает дубликаты, вместо незаметного перезаписывания.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::getEntries(): array|false

Процедурный стиль:

function rar_list(RarArchive $rarfile): array|false

Возвращает элементы (файлы и директории) из RAR архива.

Замечание:

Если архив имеет элементы с одинаковым именем, то этот метод совместно с циклом foreach по RarArchive и доступом к нему как к массиву с числовыми индексами являются единственными способами получить доступ к этим элементам (т.е. RarArchive::getEntry() и rar:// обработчик (wrapper) не помогут).

Список параметров

rarfile

Объект RarArchive открытый с помощью rar_open().

Возвращаемые значения

rar_list() возвращает массив объектов RarEntry или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 3.0.0 Исправлена поддержка RAR архивов с повторяющимися именами элементов.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_listRarArchive::getEntries -- rar_list — Возвращает полный список элементов из RAR архива

(PECL rar >= 2.0.0) · rar

function rar_list(RarArchive $rarfile): array|false

Процедурная форма RarArchive::getEntries: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::getEntries

ФормаИспользование
Методpublic function RarArchive::getEntries(): array|false
Процедурная функцияfunction rar_list(RarArchive $rarfile): array|false
RarArchive::getEntryRarArchive::getEntry -- rar_entry_get — Возвращает объект элемента из RAR архива

(PECL rar >= 2.0.0) · rar

public function RarArchive::getEntry(string $entryname): RarEntry|false
function rar_entry_get(RarArchive $rarfile, string $entryname): RarEntry|false

Получить определённый чек и сообщить об отсутствии счёта. Имя receipt.txt — точное имя внутри контейнера. Это не путь к уже извлечённому файлу на диске.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Получить определённый чек и сообщить об отсутствии счётаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
try { $archive->getEntry('invoice.txt'); }
catch (RarException $error) { echo "Счёт invoice.txt не приложен\n"; }
$archive->close();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Счёт invoice.txt не приложен

В support.php включены исключения, поэтому отсутствие invoice.txt попадает в catch. Без этого режима контракт возвращает false с предупреждением. Для одинаковых имён getEntry возвращает первую запись; полный список нужен для обнаружения неоднозначности.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::getEntry(string $entryname): RarEntry|false

Процедурный стиль:

function rar_entry_get(RarArchive $rarfile, string $entryname): RarEntry|false

Возвращает объект элемента (файл или директорию) из RAR архива

Замечание:

Вы также можете получить объекты элементов с помощью RarArchive::getEntries().

Учтите, что RAR архив может иметь несколько элементов с одинаковым именем. Данный метод вернёт только первый из них.

Список параметров

rarfile

Объект RarArchive открытый с помощью rar_open().

entryname

Путь до элемента RAR архива.

Замечание:

Путь должен быть таким же, как и возвращаемый методом RarEntry::getName().

Возвращаемые значения

Возвращает найденный объект RarEntry или false, если возникла ошибка.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_entry_getRarArchive::getEntry -- rar_entry_get — Возвращает объект элемента из RAR архива

(PECL rar >= 2.0.0) · rar

function rar_entry_get(RarArchive $rarfile, string $entryname): RarEntry|false

Процедурная форма RarArchive::getEntry: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::getEntry

ФормаИспользование
Методpublic function RarArchive::getEntry(string $entryname): RarEntry|false
Процедурная функцияfunction rar_entry_get(RarArchive $rarfile, string $entryname): RarEntry|false
RarArchive::isSolidRarArchive::isSolid -- rar_solid_is — Проверить, является ли архив сплошным

(PECL rar >= 2.0.0) · rar

public function RarArchive::isSolid(): bool
function rar_solid_is(RarArchive $rarfile): bool

Показать документы из сплошного архива. В solid-архиве распаковка позднего файла может зависеть от предыдущих записей. Проверка нужна для выбора последовательной выдачи, а не для вывода bool.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Показать документы из сплошного архиваСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/solid.rar');
if ($archive === false) { throw new RuntimeException('Не открыт архив'); }
if ($archive->isSolid()) { echo "Сплошной архив: читаем документы последовательно\n"; }
foreach ($archive as $entry) { echo $entry->getName(), ":\n", readDocument($entry); }
$archive->close();
Ожидаемый результат
Сплошной архив: читаем документы последовательно
receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
notice.txt:
Получить заказ в пункте № 3.

Сам isSolid не распаковывает документы и не гарантирует их целостность. В этом ZIP support.php читает ровно предварительно ограниченный getUnpackedSize и затем проверяет CRC: чтение за конец solid-записи в проверенной rar4.2.0 выдаёт предупреждение unfinished. Это отмеченная особенность данного декодера, не причина игнорировать CRC. Для многократного случайного доступа к большим solid-пакетам учитывайте стоимость повторного декодирования; не обещайте постоянное время поиска.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::isSolid(): bool

Процедурный стиль:

function rar_solid_is(RarArchive $rarfile): bool

Проверяет, является ли архив сплошным. Извлечение одного конкретного файла из сплошного архива заметно медленнее.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает true, если да и false, если нет.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_solid_isRarArchive::isSolid -- rar_solid_is — Проверить, является ли архив сплошным

(PECL rar >= 2.0.0) · rar

function rar_solid_is(RarArchive $rarfile): bool

Процедурная форма RarArchive::isSolid: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::isSolid

ФормаИспользование
Методpublic function RarArchive::isSolid(): bool
Процедурная функцияfunction rar_solid_is(RarArchive $rarfile): bool
RarArchive::isBrokenRarArchive::isBroken -- rar_broken_is — Проверяет, не сломан ли архив (не завершён)

(PECL rar >= 3.0.0) · rar

public function RarArchive::isBroken(): bool
function rar_broken_is(RarArchive $rarfile): bool

Остановить приём при отсутствии следующих томов. Вложен только первый том собственного набора. Обработчик возвращает null: других частей в этой поставке нет, повторно искать неизвестный путь не нужно.

Третий аргумент open — функция поиска следующего тома. Параметр $missing содержит ожидаемый путь; возвращённый null сообщает, что подходящего локального файла нет. Функция не обращается к сети.

Остановить приём при отсутствии следующих томовСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/missing.part01.rar', null, static function (string $missing): ?string { return null; });
if ($archive === false) { throw new RuntimeException('Не открыт первый том'); }
if ($archive->isBroken()) { echo "Поставка неполная: запросите все тома; результат не создан\n"; }
else { throw new RuntimeException('Ожидался неполный вход'); }
$archive->close();
Ожидаемый результат
Поставка неполная: запросите все тома; результат не создан

isBroken проверяет неполный набор/обрезанный том, а не любую возможную порчу каждого распакованного файла. false у уже закрытого объекта тоже не является подтверждением исправности. Здесь включены исключения.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::isBroken(): bool

Процедурный стиль:

function rar_broken_is(RarArchive $rarfile): bool

Функция определяет, является ли архив незавершённым, т.е. том обрезан или отсутствует.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает true, если архив сломан и false, если нет. Также, функция может вернуть false, если переданный файл уже закрыт. Единственный вариант определить точную причину - это разрешить исключения с помощью RarException::setUsingExceptions(); однако, это не так уж и важно, поскольку приложение всё равно не сможет работать с закрытым файлом.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_broken_isRarArchive::isBroken -- rar_broken_is — Проверяет, не сломан ли архив (не завершён)

(PECL rar >= 3.0.0) · rar

function rar_broken_is(RarArchive $rarfile): bool

Процедурная форма RarArchive::isBroken: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::isBroken

ФормаИспользование
Методpublic function RarArchive::isBroken(): bool
Процедурная функцияfunction rar_broken_is(RarArchive $rarfile): bool
RarArchive::setAllowBrokenRarArchive::setAllowBroken — Открывать ли повреждённые архивы

(PECL rar >= 3.0.0) · rar

public function RarArchive::setAllowBroken(bool $allow_broken): bool
function rar_allow_broken_set(RarArchive $rarfile, bool $allow_broken): bool

Из неполной поставки спасти только целый чек. Иногда нужен отдельный режим восстановления. Разрешение чтения повреждённого архива не чинит его: сохранять можно только найденный документ, успешно прошедший проверку.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Из неполной поставки спасти только целый чекСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/missing.part01.rar', null, static function (string $missing): ?string { return null; });
if ($archive === false) { throw new RuntimeException('Не открыт первый том'); }
$archive->setAllowBroken(true);
$entries = $archive->getEntries();
if ($entries === false) { throw new RuntimeException('Даже частичный перечень недоступен'); }
foreach ($entries as $entry) {
    if ($entry->getName() !== 'receipt.txt') { continue; }
    $text = readDocument($entry);
    if (file_put_contents(__DIR__ . '/recovered-receipt.txt', $text) !== strlen($text)) { throw new RuntimeException('Не сохранён чек'); }
    echo "Восстановлен recovered-receipt.txt; вся поставка остаётся неполной:\n", $text;
}
$archive->close();
Ожидаемый результат
Восстановлен recovered-receipt.txt; вся поставка остаётся неполной:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Это отдельное ручное восстановление собственного входа, а не обход обычной политики приёма. Нельзя подписывать результат как полный заказ. Для многотомного файла, оборванного посередине, подходящей полной записи может не оказаться.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

Объектно-ориентированный стиль (метод):

public function RarArchive::setAllowBroken(bool $allow_broken): bool

Процедурный стиль:

function rar_allow_broken_set(RarArchive $rarfile, bool $allow_broken): bool

Метод определяет, можно ли пытаться читать повреждённый архив, или все операции с ним должны заканчиваться ошибкой. Повреждённые архивы - это такие архивы, которые открываются без ошибок, но при попытке прочитать записи возникают ошибки.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

allow_broken

Разрешать ли работу с повреждёнными архивами (true) или нет (false).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. Ошибка может возникнуть только если файл уже закрыт.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_allow_broken_setRarArchive::setAllowBroken — Открывать ли повреждённые архивы

(PECL rar >= 3.0.0) · rar

function rar_allow_broken_set(RarArchive $rarfile, bool $allow_broken): bool

Процедурная форма RarArchive::setAllowBroken: первым аргументом передайте открытый RarArchive. Остальные аргументы, ошибки, возврат и ограничения доступны в полном договоре метода.

Полный контракт и работающий сценарий RarArchive::setAllowBroken

ФормаИспользование
Методpublic function RarArchive::setAllowBroken(bool $allow_broken): bool
Процедурная функцияfunction rar_allow_broken_set(RarArchive $rarfile, bool $allow_broken): bool
RarArchive::__toStringRarArchive::__toString — Получить текстовое представление

(PECL rar >= 2.0.0) · rar

public function RarArchive::__toString(): string

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

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Оставить диагностическое описание отдельно от выдаваемого чекаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$before = (string) $archive;
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
$after = (string) $archive;
file_put_contents(__DIR__ . '/archive-diagnostic.txt', $before . "\n" . $after . "\n");
echo "Описание до и после закрытия сохранено в archive-diagnostic.txt\n";
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Описание до и после закрытия сохранено в archive-diagnostic.txt

В журнале будет фактический абсолютный путь вашей папки и отметка закрытия. Не разбирайте строку регулярным выражением ради бизнес-логики: её оформление не гарантировано. Сам чек получен отдельным API чтения, а не из диагностической строки.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarArchive::__toString(): string

Возвращает строку, представляющую объект RarArchive. Она содержит полный путь до текущего открытого тома архива и информацию о том, корректен ли ресурс или уже закрыт с помощью RarArchive::close().

Данный метод предназначен только для отладки, так как нет никакой гарантии из чего будет состоять ответ и как он будет отформатирован.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Текстовое представление объекта RarArchive. Контент не определён.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::extractRarEntry::extract — Извлекает элемент из архива

(PECL rar >= 0.1) · rar

public function RarEntry::extract( string $dir, string $filepath = "", string $password = NULL, bool $extended_data = false): bool

Записать чек под своим именем и прочитать файл. Получателю нужен обычный файл received/customer-receipt.txt. Второй аргумент задаёт полный путь и переопределяет исходное имя записи.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Записать чек под своим именем и прочитать файлСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$folder = __DIR__ . '/received';
if (file_exists($folder) || !mkdir($folder, 0700)) { throw new RuntimeException('Нужна новая папка'); }
$target = $folder . '/customer-receipt.txt';
if (!$entry->extract('', $target, null, false)) { throw new RuntimeException('Не извлечён чек'); }
echo "received/customer-receipt.txt:\n", file_get_contents($target);
$archive->close();
Ожидаемый результат
received/customer-receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

У RarEntry::extract нет параметра overwrite из ZipArchive. Третий аргумент — пароль, четвёртый — extended_data. Наш фиксированный путь находится в новой приватной папке; расширенные ACL/владельца из архива не переносим. Для чужого набора предпочтителен полный bounded-проект ниже.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::extract(
    string $dir,
    string $filepath = "",
    string $password = NULL,
    bool $extended_data = false
): bool

RarEntry::extract() извлекает содержимое элемента. При этом создаётся новый файл в указанной директории dir с именем совпадающим с именем элемента, если только не задан второй аргумент. Смотрите подробнее ниже.

Список параметров

dir

Путь к директории, куда необходимо извлечь файлы. Этот параметр учитывается только если не указан параметр filepath. Если оба параметра не указаны, то файлы извлекаются в текущую директорию.

filepath

Путь (полный или относительный) содержит директорию и имя извлекаемого файла. Этот параметр переопределяет и параметр dir и оригинальное имя файла.

password

Пароль используется для расшифровки текущего элемента. Если элемент не зашифрован, то этот параметр не будет использован и его можно не указывать. Если же этот параметр не указан, а элемент зашифрован, то будет использован пароль, переданный функции rar_open(), если её вызывали. Если передан неверный пароль, явно или неявно через rar_open(), то проверка CRC будет неудачной и будет возвращён false. Вы можете проверить является ли элемент зашифрованным с помощью RarEntry::isEncrypted().

extended_data

Если true, то в извлекаемый файл будет добавлена дополнительная информация, такая как NTFS ACL и владелец в системе Unix, если они присутствовали в архиве.

Внимание

До версии 2.0.0, не обрабатывала относительные пути корректно. Используйте для этой ситуации realpath().

Возвращаемые значения

Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 3.0.0 Был добавлен параметр extended_data.
PECL rar 3.0.0 Исправлена поддержка RAR архивов с повторяющимися именами элементов.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getStreamRarEntry::getStream — Получить обработчик для записи

(PECL rar >= 2.0.0) · rar

public function RarEntry::getStream(string $password = ?): resource|false

Прочитать чек без извлечения и проверить CRC. getStream даёт ресурс для последовательного чтения. Само получение потока и даже успешное чтение не проверяют, что пароль/байты правильные.

Ресурс $stream — открытый канал чтения; stream_get_contents возвращает байты, fclose освобождает его. finally выполняется при успехе и исключении. hash("crc32b", $text) вычисляет контрольную сумму прочитанного текста; hash_equals сравнивает её с записью архива.

Прочитать чек без извлечения и проверить CRCСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$stream = $entry->getStream();
if ($stream === false) { throw new RuntimeException('Не открыт поток'); }
try { $text = stream_get_contents($stream, 1025); }
finally { fclose($stream); }
$crc = str_pad(strtolower($entry->getCrc()), 8, '0', STR_PAD_LEFT);
if ($text === false || strlen($text) !== $entry->getUnpackedSize() || !hash_equals($crc, hash('crc32b', $text))) {
    throw new RuntimeException('Не выдаём неполный или повреждённый чек');
}
echo $text;
$archive->close();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Этот код — раскрытый вариант readDocument для маленького собственного файла. В полном helper есть и предварительный лимит размера. CRC обнаруживает случайную порчу, но злоумышленник может изменить и содержимое, и CRC: доверие отправителю обеспечивается отдельно.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getStream(string $password = ?): resource|false

Возвращает обработчик, поддерживающий операцию чтения. Этот обработчик умеет распаковывать запись на лету.

Обработчик не уничтожается при вызове rar_close().

Внимание

Результирующий поток не проверяется на целостность. Следовательно никак не определяется порча файла или расшифровка с неверным ключом. Проверка контрольной суммы разжатого и расшифрованного файла полностью на совести разработчика.

Список параметров

password

Пароль, использовавшийся для шифрования записи. Если запись не шифрована, то этот параметр игнорируется и в целом может быть опущен. Если же параметр опущен, а запись шифрована, то будет использован пароль заданный в функции rar_open(), если конечно он был задан. Если был задан неверный пароль, явно или неявно через rar_open(), этот метод вернёт поток с неверными данными. Если пароль не задан вообще, а он нужен, то метод вернёт false. Зашифрована ли запись или нет можно проверить с помощью RarEntry::isEncrypted().

Возвращаемые значения

Обработчик или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 3.0.0 Поддержка RAR-архивов с дублирующимися именами записей теперь работает нормально.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getNameRarEntry::getName — Возвращает имя элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getName(): string

Использовать внутреннее имя как подпись документа. getName возвращает UTF-8 имя записи, а не извлечённый путь. Поэтому file_get_contents($entry->getName()) не прочитает архив.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Использовать внутреннее имя как подпись документаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
echo 'Документ ', $entry->getName(), ":\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Документ receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Имя можно показать после HTML-экранирования или сравнить с точным разрешённым списком. Не соединяйте произвольное внутреннее имя с папкой извлечения: ../, абсолютные пути, ссылки и одинаковые имена требуют отдельной политики.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getName(): string

Возвращает имя элемента массива (вместе с путём).

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает имя элемента в виде строки, или false в случае возникновения ошибки.

Список изменений

Версия Описание
PECL rar 2.0.0 Начиная с версии 2.0.0 возвращается строка в кодировке Unicode/UTF-8.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getAttrRarEntry::getAttr — Возвращает атрибуты элемента архива

(PECL rar >= 0.1) · rar

public function RarEntry::getAttr(): int

Не переносить чужие права при выдаче документа. Атрибуты имеют смысл только вместе с исходной ОС. Наш вход создан в Linux; выберем только обычный Unix-файл и сохраним копию с собственной политикой прав.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Не переносить чужие права при выдаче документаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$host = $entry->getHostOs();
$attributes = $entry->getAttr();
if ($host !== RarEntry::HOST_UNIX || ($attributes & 0170000) !== 0100000) { throw new RuntimeException('Ожидался обычный Unix-файл'); }
$text = readDocument($entry);
file_put_contents(__DIR__ . '/customer-receipt.txt', $text);
echo "Обычный файл из Unix; исходные права не назначаем получателю:\n", $text;
$archive->close();
Ожидаемый результат
Обычный файл из Unix; исходные права не назначаем получателю:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

& выделяет биты типа файла, а запись числа с начальным 0 использует восьмеричную систему Unix-режимов. Для Windows другие биты: например 0x10 обозначает каталог. Нельзя применять Unix-маску ко всем ОС или считать !isDirectory доказательством обычного файла: это может быть ссылка.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getAttr(): int

Возвращает атрибуты элемента архива, зависящие от операционной системы.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает атрибуты или false в случае возникновения ошибки.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getHostOsRarEntry::getHostOs — Возвращает оригинальную ОС элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getHostOs(): int

Не переносить чужие права при выдаче документа. Атрибуты имеют смысл только вместе с исходной ОС. Наш вход создан в Linux; выберем только обычный Unix-файл и сохраним копию с собственной политикой прав.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Не переносить чужие права при выдаче документаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$host = $entry->getHostOs();
$attributes = $entry->getAttr();
if ($host !== RarEntry::HOST_UNIX || ($attributes & 0170000) !== 0100000) { throw new RuntimeException('Ожидался обычный Unix-файл'); }
$text = readDocument($entry);
file_put_contents(__DIR__ . '/customer-receipt.txt', $text);
echo "Обычный файл из Unix; исходные права не назначаем получателю:\n", $text;
$archive->close();
Ожидаемый результат
Обычный файл из Unix; исходные права не назначаем получателю:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

& выделяет биты типа файла, а запись числа с начальным 0 использует восьмеричную систему Unix-режимов. Для Windows другие биты: например 0x10 обозначает каталог. Нельзя применять Unix-маску ко всем ОС или считать !isDirectory доказательством обычного файла: это может быть ссылка.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getHostOs(): int

Возвращает код оригинальной операционной системы, в которой был создан элемент архива.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает код ОС, или false в случае возникновения ошибки.

Смотрите также

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getCrcRarEntry::getCrc — Возвращает CRC элемента архива

(PECL rar >= 0.1) · rar

public function RarEntry::getCrc(): string

Сверить байты чека с контрольной суммой. Контрольная сумма нужна для решения, можно ли выдавать прочитанный документ. Выведем сам чек только после совпадения.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Сверить байты чека с контрольной суммойСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$expectedCrc = str_pad(strtolower($entry->getCrc()), 8, '0', STR_PAD_LEFT);
$text = readDocument($entry);
echo 'CRC ', $expectedCrc, " совпал; получатель читает:\n", $text;
$archive->close();
Ожидаемый результат
CRC ac0a4bdf совпал; получатель читает:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

getCrc возвращает шестнадцатеричную строку. str_pad добавляет ведущие нули до восьми знаков перед сравнением с crc32b. Это контроль ошибок, не криптографическая подпись источника.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getCrc(): string

Возвращает шестнадцатеричное строковое представление CRC элемента архива.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Метод возвращает CRC элемента архива или false, если возникла ошибка.

Список изменений

Версия Описание
PECL rar 2.0.0 Теперь этот метод возвращает корректные значения для многотомных архивов.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getFileTimeRarEntry::getFileTime — Возвращает последнее время изменения элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getFileTime(): string

Подписать документ временем из архива. Человек видит, какую редакцию ему прислали. Исходный чек получил время 2026-10-14 09:30:00 UTC. Наша Windows в часовом поясе UTC+3 возвращает из RAR строку12:30:00; ниже зафиксирован именно этот наблюдаемый результат.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Подписать документ временем из архиваСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
echo 'Изменён у отправителя: ', $entry->getFileTime(), "\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Изменён у отправителя: 2026-10-14 12:30:00
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Метод возвращает строку YYYY-MM-DD HH:II:SS без отдельного смещения часового пояса. На другой ОС/часовом поясе строка может отличаться; PHP date.timezone не обязана управлять преобразованием во внешней библиотеке. Не превращайте её молча в достоверное серверное время получения: отправитель может задать другое время. В журнале приёма своё время фиксируют отдельно.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getFileTime(): string

Метод возвращает время последнего изменения элемента.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Метод возвращает в виде строки в формате YYYY-MM-DD HH:II:SS время последнего изменения элемента, или false, если возникла ошибка.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getPackedSizeRarEntry::getPackedSize — Возвращает размер сжатого элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getPackedSize(): int

Проверить лимит перед чтением и выдать документ. Размер хранения и размер после распаковки — разные числа. В нашем orders.rar выбран режим без сжатия; оба размера равны длине UTF-8 чека, но для сжатого входа это не общее правило.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Проверить лимит перед чтением и выдать документСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$stored = $entry->getPackedSize();
$unpacked = $entry->getUnpackedSize();
if ($stored > 32768 || $unpacked > 1024) { throw new RuntimeException('Превышен лимит документа'); }
echo 'Чек: ', $stored, ' байт хранения, ', $unpacked, " байт текста\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Чек: 61 байт хранения, 61 байт текста
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Числа измеряют байты, не буквы. Заявленные размеры нужны для раннего отказа, а ограниченное чтение и сравнение фактической длины — для подтверждения. Коэффициент сжатия сам по себе не защищает от истощения памяти/CPU; квоты процесса остаются нужны.

Версионное уточнение: оговорка старого текста о Windows x64 и 32-битных целых не описывает современный PHP x64. Проверяйте PHP_INT_SIZE/PHP_INT_MAX конкретного процесса; наш PHP 8.3.35 x64 использует 64-битный int. Это не отменяет лимитов памяти и квот распаковки.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getPackedSize(): int

Возвращает размер сжатого элемента архива.

Замечание:

Учтите, что на платформах с 32-х битными целыми long (включая Windows x64), максимальный возвращаемый размер ограничен 2 ГБ. Проверьте константу PHP_INT_MAX.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает размер сжатого элемента, или false в случае возникновения ошибки.

Список изменений

Версия Описание
PECL rar 2.0.0 Данный метод теперь возвращает правильные значения для сжатых данных больше 2 ГБ на платформах с 64-х битными целыми (int) и никогда не возвращает отрицательные значения на всех платформах.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getUnpackedSizeRarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии

(PECL rar >= 0.1) · rar

public function RarEntry::getUnpackedSize(): int

Проверить лимит перед чтением и выдать документ. Размер хранения и размер после распаковки — разные числа. В нашем orders.rar выбран режим без сжатия; оба размера равны длине UTF-8 чека, но для сжатого входа это не общее правило.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Проверить лимит перед чтением и выдать документСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$stored = $entry->getPackedSize();
$unpacked = $entry->getUnpackedSize();
if ($stored > 32768 || $unpacked > 1024) { throw new RuntimeException('Превышен лимит документа'); }
echo 'Чек: ', $stored, ' байт хранения, ', $unpacked, " байт текста\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Чек: 61 байт хранения, 61 байт текста
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Числа измеряют байты, не буквы. Заявленные размеры нужны для раннего отказа, а ограниченное чтение и сравнение фактической длины — для подтверждения. Коэффициент сжатия сам по себе не защищает от истощения памяти/CPU; квоты процесса остаются нужны.

Версионное уточнение: оговорка старого текста о Windows x64 и 32-битных целых не описывает современный PHP x64. Проверяйте PHP_INT_SIZE/PHP_INT_MAX конкретного процесса; наш PHP 8.3.35 x64 использует 64-битный int. Это не отменяет лимитов памяти и квот распаковки.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getUnpackedSize(): int

Возвращает размер элемента архива в распакованном состоянии.

Замечание:

Учтите, что на платформах с 32-х битными целыми long (включая Windows x64), максимальный возвращаемый размер ограничен 2 ГБ. Проверьте константу PHP_INT_MAX.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает размер распакованного элемента, или false в случае возникновения ошибки.

Список изменений

Версия Описание
PECL rar 2.0.0 Данный метод теперь возвращает правильные значения для сжатых данных больше 2 ГБ на платформах с 64-х битными целыми (int) и никогда не возвращает отрицательные значения на всех платформах.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getMethodRarEntry::getMethod — Возвращает метод компрессии элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getMethod(): int

Сохранить данные для диагностики совместимости. Если другой получатель не может открыть документ, полезны номер способа сжатия и минимальная версия RAR. Сохраняем фактические поля рядом с успешно прочитанным чеком.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Сохранить данные для диагностики совместимостиСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$method = $entry->getMethod();
$version = $entry->getVersion();
file_put_contents(__DIR__ . '/decoder-report.json', json_encode(['method' => $method, 'minimum_rar_version' => $version], JSON_THROW_ON_ERROR));
echo "Параметры декодера сохранены в decoder-report.json; документ прочитан:\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Параметры декодера сохранены в decoder-report.json; документ прочитан:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

getVersion описывает минимальную версию архиватора (10 × major + minor), а не версию PHP или расширения. getMethod — код метода записи. Возможность декодирования всё равно подтверждается чтением; ветвь по одному числу не гарантирует поддержку всех новых вариантов RAR.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getMethod(): int

Метод RarEntry::getMethod() возвращает число, которое соответствует методу компрессии, использовавшемуся при добавлении текущего элемента архива.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Метод возвращает номер метода или false, если возникла ошибка.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::getVersionRarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента

(PECL rar >= 0.1) · rar

public function RarEntry::getVersion(): int

Сохранить данные для диагностики совместимости. Если другой получатель не может открыть документ, полезны номер способа сжатия и минимальная версия RAR. Сохраняем фактические поля рядом с успешно прочитанным чеком.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Сохранить данные для диагностики совместимостиСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
$method = $entry->getMethod();
$version = $entry->getVersion();
file_put_contents(__DIR__ . '/decoder-report.json', json_encode(['method' => $method, 'minimum_rar_version' => $version], JSON_THROW_ON_ERROR));
echo "Параметры декодера сохранены в decoder-report.json; документ прочитан:\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Параметры декодера сохранены в decoder-report.json; документ прочитан:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

getVersion описывает минимальную версию архиватора (10 × major + minor), а не версию PHP или расширения. getMethod — код метода записи. Возможность декодирования всё равно подтверждается чтением; ветвь по одному числу не гарантирует поддержку всех новых вариантов RAR.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::getVersion(): int

Возвращает минимальную версию программы RAR (т.е. WinRAR), необходимую для распаковки элемента архива. Она закодирована в виде: 10 * основная версия + минорная версия.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает версию или false в случае возникновения ошибки.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::isDirectoryRarEntry::isDirectory — Проверяет, является ли запись директорией

(PECL rar >= 2.0.0) · rar

public function RarEntry::isDirectory(): bool

Показать папку и отдельно её документы. directories.rar содержит пустую acts и чек. Каталог не читают как текст: выводим его назначение, а для файла получаем содержимое.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Показать папку и отдельно её документыСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/directories.rar');
if ($archive === false) { throw new RuntimeException('Не открыт вход'); }
foreach ($archive as $entry) {
    if ($entry->isDirectory()) { echo 'Папка для документов: ', $entry->getName(), "\n"; }
    else { echo $entry->getName(), ":\n", readDocument($entry); }
}
$archive->close();
Ожидаемый результат
receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Папка для документов: acts

false означает только отсутствие признака каталога. Для безопасной записи на диск ссылки/специальные Unix-объекты дополнительно отбрасываются по host/attr в полном проекте.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::isDirectory(): bool

Проверяет, является ли текущая запись директорией.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает true или false в зависимости от результата.

Примечания

Функция доступна с версии 2.0.0, а для более ранних версий можно проверять атрибуты записи (Работает только для файлов, сжатых в RAR для Windows или Unix):

<?php
//...
//Откроем файл, получим запись и сохраним в переменной $e...
//...

$isDirectory = (bool) ((($e->getHostOs() == RAR_HOST_WIN32) && ($e->getAttr() & 0x10)) ||
    (($e->getHostOs() == RAR_HOST_UNIX) && (($e->getAttr() & 0xf000) == 0x4000)));
?>

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::isEncryptedRarEntry::isEncrypted — Проверяет, зашифрована ли запись

(PECL rar >= 2.0.0) · rar

public function RarEntry::isEncrypted(): bool

Запросить пароль для защищённого чека. В encrypted.rar имя видно без пароля, но байты защищены. Проверка выбирает путь с учебным паролем, extract выполняет проверку внутри декодера, а полученный файл дополнительно сравнивается с нашим оригиналом.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Запросить пароль для защищённого чекаСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$archive = RarArchive::open(__DIR__ . '/input/encrypted.rar');
if ($archive === false) { throw new RuntimeException('Не открыт вход'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
if (!$entry->isEncrypted()) { throw new RuntimeException('Ожидался защищённый чек'); }
$target = __DIR__ . '/protected-receipt.txt';
if (file_exists($target) || !$entry->extract('', $target, 'Lesson42', false)) { throw new RuntimeException('Не извлечён защищённый чек'); }
$text = file_get_contents($target);
if ($text !== file_get_contents(__DIR__ . '/input/receipt.txt')) { throw new RuntimeException('Не совпал исходный документ'); }
echo "Для чека нужен пароль; после его ввода получено:\n", $text;
$archive->close();
Ожидаемый результат
Для чека нужен пароль; после его ввода получено:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Lesson42 — публичный пароль учебного файла, не настоящий секрет. В RAR5 шифрование может преобразовывать CRC с участием ключа: getCrc тогда нельзя напрямую сравнивать с обычным crc32b. Поэтому здесь extract проверяет документ внутри UnRAR, а мы дополнительно сравниваем весь извлечённый текст с независимым учебным оригиналом. Поток getStream сам такую проверку не даёт. В приложении его получают из подходящего закрытого источника, не включают в URL/журнал. Для разных записей пароли могут различаться; скрытые имена требуют пароля уже на open.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::isEncrypted(): bool

Проверяет, зашифрована ли текущая запись.

Замечание:

В одном и том же архиве для разных файлов могут использоваться разные пароли.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает true или false в зависимости от результата.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarEntry::__toStringRarEntry::__toString — Получить текстовое представление записи

(PECL rar >= 2.0.0) · rar

public function RarEntry::__toString(): string

Сохранить описание записи и выдать её содержимое. Строковое представление полезно в диагностике. Содержимое документа читается отдельным API и не подменяется строкой RarEntry for file.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Сохранить описание записи и выдать её содержимоеСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/bootstrap.php';
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Нет чека'); }
file_put_contents(__DIR__ . '/entry-diagnostic.txt', (string) $entry . "\n");
echo "Описание записи сохранено в entry-diagnostic.txt; сам чек:\n", readDocument($entry);
$archive->close();
Ожидаемый результат
Описание записи сохранено в entry-diagnostic.txt; сам чек:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Имя, CRC и вид записи в отладочной строке могут менять формат. Не используйте строковое представление как сериализацию или проверку того, что перед вами обычный файл; ссылки тоже могут отображаться как файлы.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public function RarEntry::__toString(): string

RarEntry::__toString() возвращает текстовое представление для текущей записи. Оно будет содержать информацию о том, является ли запись файлом или директорией (символические ссылки и прочие специальные объекты будут считаться файлами), имя записи в кодировке UTF-8 и её контрольная сумма (CRC). Вид и содержание этой информации в будущем может измениться, так что не стоит на них полагаться.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Текстовое представление записи.

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarException::setUsingExceptionsRarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок

(PECL rar >= 2.0.0) · rar

public static function RarException::setUsingExceptions(bool $using_exceptions): void

Превратить ошибку открытия в понятное сообщение. Режим исключений позволяет остановить ошибочный путь и показать человеку действие: выбрать существующий файл. В конце восстанавливаем прежний режим библиотеки.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Превратить ошибку открытия в понятное сообщениеСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$previous = RarException::isUsingExceptions();
RarException::setUsingExceptions(true);
try {
    RarArchive::open(__DIR__ . '/input/absent.rar');
} catch (RarException $error) {
    file_put_contents(__DIR__ . '/rar-error.txt', $error->getMessage());
    echo "Файл поставки отсутствует; уточните путь. Диагностика — rar-error.txt\n";
} finally { RarException::setUsingExceptions($previous); }
$archive = RarArchive::open(__DIR__ . '/input/orders.rar');
if ($archive === false) { throw new RuntimeException('Нет исправного входа'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
Ожидаемый результат
Файл поставки отсутствует; уточните путь. Диагностика — rar-error.txt
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Пара isUsingExceptions/setUsingExceptions относится к настройке расширения в текущем выполнении. Не все ошибки программирования становятся RarException: например неправильный тип аргумента может дать TypeError. Журнал хранит техническую причину, читателю не показывается серверный путь.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public static function RarException::setUsingExceptions(bool $using_exceptions): void

Если аргумент задан как true, то, вместо выдачи предупреждения и возврата ошибки, библиотека UnRAR будет выбрасывать исключение типа RarException в случае возникновения ошибки.

Также исключения будут выброшены в случае следующих ошибок, произошедших вне библиотеки (их код возврата должен быть равен -1):

  • попытка произведения действий с закрытым объектом RarArchive или объектом RarEntry относящегося к первому;

  • попытка извлечь отсутствующую запись с помощью RarArchive::getEntry().

Список параметров

using_exceptions

true для активации генерации исключений, false для деактивации (по умолчанию).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • RarException::isUsingExceptions() - Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

RarException::isUsingExceptionsRarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

(PECL rar >= 2.0.0) · rar

public static function RarException::isUsingExceptions(): bool

Превратить ошибку открытия в понятное сообщение. Режим исключений позволяет остановить ошибочный путь и показать человеку действие: выбрать существующий файл. В конце восстанавливаем прежний режим библиотеки.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Превратить ошибку открытия в понятное сообщениеСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$previous = RarException::isUsingExceptions();
RarException::setUsingExceptions(true);
try {
    RarArchive::open(__DIR__ . '/input/absent.rar');
} catch (RarException $error) {
    file_put_contents(__DIR__ . '/rar-error.txt', $error->getMessage());
    echo "Файл поставки отсутствует; уточните путь. Диагностика — rar-error.txt\n";
} finally { RarException::setUsingExceptions($previous); }
$archive = RarArchive::open(__DIR__ . '/input/orders.rar');
if ($archive === false) { throw new RuntimeException('Нет исправного входа'); }
$entry = $archive->getEntry('receipt.txt');
if ($entry === false) { throw new RuntimeException('Чек не приложен'); }
echo readDocument($entry);
$archive->close();
Ожидаемый результат
Файл поставки отсутствует; уточните путь. Диагностика — rar-error.txt
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

Пара isUsingExceptions/setUsingExceptions относится к настройке расширения в текущем выполнении. Не все ошибки программирования становятся RarException: например неправильный тип аргумента может дать TypeError. Журнал хранит техническую причину, читателю не показывается серверный путь.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

public static function RarException::isUsingExceptions(): bool

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

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Возвращает true, если используются исключения и false, если нет.

Смотрите также

  • RarException::setUsingExceptions() - Включить или отключить генерацию исключений вместо возвращения ошибок

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

rar_wrapper_cache_statsrar_wrapper_cache_stats — Кеш доступов и отказов обёртки URL

(PECL rar >= 3.0.0) · rar

function rar_wrapper_cache_stats(): string

Снять диагностические показания около реального чтения. Функция помогает наблюдать внутренний кеш обёртки. Полезная операция — чтение нашего чека через rar://; диагностический формат не используется в логике выдачи.

Архив ZIP содержит все входы и полный support.php. readDocument читает не больше 1025 байт, проверяет размер и CRC, затем возвращает настоящий текст. Пошаговый разбор исходников.

Снять диагностические показания около реального чтенияСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/support.php';
$path = __DIR__ . '/input/orders.rar';
$url = 'rar://' . rawurlencode($path) . '#' . rawurlencode('receipt.txt');
$before = rar_wrapper_cache_stats();
$text = file_get_contents($url);
if ($text === false || $text !== file_get_contents(__DIR__ . '/input/receipt.txt')) { throw new RuntimeException('Не получен исходный чек'); }
$after = rar_wrapper_cache_stats();
file_put_contents(__DIR__ . '/wrapper-cache.txt', $before . "\n" . $after . "\n");
echo "Чек прочитан через rar://; диагностика кеша — wrapper-cache.txt:\n", $text;
Ожидаемый результат
Чек прочитан через rar://; диагностика кеша — wrapper-cache.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.

rawurlencode кодирует путь контейнера и отдельное имя записи; # разделяет их. Это локальная обёртка, а не HTTP-запрос. Статистика может зависеть от истории процесса; нет обещания фиксированных чисел или публичного договора полей.

Официальная страница пока не описывает формат результата. Поэтому пример сохраняет диагностическую строку как непрозрачный текст, не разбирает её на обещанные поля и проверяет полезный результат отдельным чтением документа.

Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.

Описание

function rar_wrapper_cache_stats(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным PHP 8.3.35 NTS x64 + PECL rar 4.2.0. Основной PHP 8.5.11 не имеет rar: проверка его синтаксиса не подтверждает выполнение API. Официальная DLL 4.2.0 при старте PHP 8.3 выдаёт предупреждения совместимости __toString/getIterator; они записаны отдельно от результата урока и требуют внимания при выборе окружения.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.