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

Дерево руководства
Глава 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-скриптом.
- input/orders.rar — настоящий внешний контейнер
- receipt.txt — внутреннее имя
- getStream — поток его распакованных байтов
- 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 — проверка повреждения, не проверка авторства.
- $entry из getEntry("receipt.txt") передаётся локальному параметру $entry функции
- getStream открывает байты этой записи; $text получает прочитанный текст
- Размер61байт и CRC проверяются для обычного учебного файла
- 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;
}
}
<?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.
<?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
- rar_wrapper_cache_stats — Кеш доступов и отказов обёртки URL
- RarArchive — Класс RarArchive
- RarArchive::close — Закрывает RAR архив и освобождает все ресурсы
- RarArchive::getComment — Получить текст комментария из архива RAR
- RarArchive::getEntries — Возвращает полный список элементов из RAR архива
- RarArchive::getEntry — Возвращает объект элемента из RAR архива
- RarArchive::isBroken — Проверяет, не сломан ли архив (не завершён)
- RarArchive::isSolid — Проверить, является ли архив сплошным
- RarArchive::open — Открывает архив RAR
- RarArchive::setAllowBroken — Открывать ли повреждённые архивы
- RarArchive::__toString — Получить текстовое представление
- RarEntry — Класс RarEntry
- RarEntry::extract — Извлекает элемент из архива
- RarEntry::getAttr — Возвращает атрибуты элемента архива
- RarEntry::getCrc — Возвращает CRC элемента архива
- RarEntry::getFileTime — Возвращает последнее время изменения элемента
- RarEntry::getHostOs — Возвращает оригинальную ОС элемента
- RarEntry::getMethod — Возвращает метод компрессии элемента
- RarEntry::getName — Возвращает имя элемента
- RarEntry::getPackedSize — Возвращает размер сжатого элемента
- RarEntry::getStream — Получить обработчик для записи
- RarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии
- RarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента
- RarEntry::isDirectory — Проверяет, является ли запись директорией
- RarEntry::isEncrypted — Проверяет, зашифрована ли запись
- RarEntry::__toString — Получить текстовое представление записи
- RarException — Класс RarException
- RarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения
- RarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок
Окружение перед первым запуском
Нужен именно 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
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().
Обзор класса
Содержание
- RarArchive::close — Закрывает RAR архив и освобождает все ресурсы
- RarArchive::getComment — Получить текст комментария из архива RAR
- RarArchive::getEntries — Возвращает полный список элементов из RAR архива
- RarArchive::getEntry — Возвращает объект элемента из RAR архива
- RarArchive::isBroken — Проверяет, не сломан ли архив (не завершён)
- RarArchive::isSolid — Проверить, является ли архив сплошным
- RarArchive::open — Открывает архив RAR
- RarArchive::setAllowBroken — Открывать ли повреждённые архивы
- RarArchive::__toString — Получить текстовое представление
RarEntry: одна запись и все её атрибуты
Экземпляр получают из открытого архива. Он хранит имя, размеры, метод, CRC, исходную ОС и её атрибуты. isDirectory=false не исключает символическую ссылку; полный официальный список битов ниже нужен для точного решения.
Официальный контракт: адаптированная документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Класс RarEntry
(PECL rar >= 0.1)
Введение
Запись RAR, представляющая директорию или сжатый файл внутри архива RAR.
Обзор класса
Предопределённые константы
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(), который также работает с записями добавленными в других операционных системах. RarEntry::ATTRIBUTE_UNIX_SYM_LINK-
Символические ссылки в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой
RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET. RarEntry::ATTRIBUTE_UNIX_SOCKET-
Специальные файлы сокетов в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой
RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.
Содержание
- RarEntry::extract — Извлекает элемент из архива
- RarEntry::getAttr — Возвращает атрибуты элемента архива
- RarEntry::getCrc — Возвращает CRC элемента архива
- RarEntry::getFileTime — Возвращает последнее время изменения элемента
- RarEntry::getHostOs — Возвращает оригинальную ОС элемента
- RarEntry::getMethod — Возвращает метод компрессии элемента
- RarEntry::getName — Возвращает имя элемента
- RarEntry::getPackedSize — Возвращает размер сжатого элемента
- RarEntry::getStream — Получить обработчик для записи
- RarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии
- RarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента
- RarEntry::isDirectory — Проверяет, является ли запись директорией
- RarEntry::isEncrypted — Проверяет, зашифрована ли запись
- RarEntry::__toString — Получить текстовое представление записи
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 - требуется пароль
Обзор класса
Содержание
- 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. |
<?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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
$filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|falseПроцедурный стиль:
$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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Закрывает 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::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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Возвращает (глобальный) комментарий, сохранённый в архиве 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
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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Возвращает элементы (файлы и директории) из RAR архива.
Замечание:
Если архив имеет элементы с одинаковым именем, то этот метод совместно с циклом
foreachпо RarArchive и доступом к нему как к массиву с числовыми индексами являются единственными способами получить доступ к этим элементам (т.е. RarArchive::getEntry() иrar://обработчик (wrapper) не помогут).
Список параметров
rarfile-
Объект RarArchive открытый с помощью rar_open().
Возвращаемые значения
rar_list() возвращает массив объектов RarEntry или false, если возникла ошибка.
Список изменений
| Версия | Описание |
|---|---|
| PECL rar 3.0.0 | Исправлена поддержка RAR архивов с повторяющимися именами элементов. |
Смотрите также
- RarArchive::getEntry() - Возвращает объект элемента из RAR архива
rar://обработчик(wrapper)
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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
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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Возвращает объект элемента (файл или директорию) из RAR архива
Замечание:
Вы также можете получить объекты элементов с помощью RarArchive::getEntries().
Учтите, что RAR архив может иметь несколько элементов с одинаковым именем. Данный метод вернёт только первый из них.
Список параметров
rarfile-
Объект RarArchive открытый с помощью rar_open().
entryname-
Путь до элемента RAR архива.
Замечание:
Путь должен быть таким же, как и возвращаемый методом RarEntry::getName().
Смотрите также
- RarArchive::getEntries() - Возвращает полный список элементов из RAR архива
rar://обработчик (wrapper)
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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::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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Проверяет, является ли архив сплошным. Извлечение одного конкретного файла из сплошного архива заметно медленнее.
Список параметров
rarfile-
Объект RarArchive, открытый с помощью rar_open().
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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::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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Функция определяет, является ли архив незавершённым, т.е. том обрезан или отсутствует.
Список параметров
rarfile-
Объект RarArchive, открытый с помощью rar_open().
Возвращаемые значения
Возвращает true, если архив сломан и false, если нет. Также, функция
может вернуть false, если переданный файл уже закрыт. Единственный вариант
определить точную причину - это разрешить исключения с помощью
RarException::setUsingExceptions(); однако,
это не так уж и важно, поскольку приложение всё равно не сможет работать с
закрытым файлом.
Смотрите также
- RarArchive::setAllowBroken() - Открывать ли повреждённые архивы
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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::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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Объектно-ориентированный стиль (метод):
Процедурный стиль:
Метод определяет, можно ли пытаться читать повреждённый архив, или все операции с ним должны заканчиваться ошибкой. Повреждённые архивы - это такие архивы, которые открываются без ошибок, но при попытке прочитать записи возникают ошибки.
Список параметров
rarfile-
Объект RarArchive, открытый с помощью rar_open().
allow_broken-
Разрешать ли работу с повреждёнными архивами (
true) или нет (false).
Возвращаемые значения
Возвращает true в случае успешного выполнения или false, если возникла ошибка.
Ошибка может возникнуть только если файл уже закрыт.
Смотрите также
- RarArchive::isBroken() - Проверяет, не сломан ли архив (не завершён)
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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
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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает строку, представляющую объект 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
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 архивов с повторяющимися именами элементов. |
Смотрите также
- RarEntry::getStream() - Получить обработчик для записи
rar://wrapper
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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 сравнивает её с записью архива.
<?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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает обработчик, поддерживающий операцию чтения. Этот обработчик умеет распаковывать запись на лету.
Обработчик не уничтожается при вызове rar_close().
Результирующий поток не проверяется на целостность. Следовательно никак не определяется порча файла или расшифровка с неверным ключом. Проверка контрольной суммы разжатого и расшифрованного файла полностью на совести разработчика.
Список параметров
password-
Пароль, использовавшийся для шифрования записи. Если запись не шифрована, то этот параметр игнорируется и в целом может быть опущен. Если же параметр опущен, а запись шифрована, то будет использован пароль заданный в функции rar_open(), если конечно он был задан. Если был задан неверный пароль, явно или неявно через rar_open(), этот метод вернёт поток с неверными данными. Если пароль не задан вообще, а он нужен, то метод вернёт
false. Зашифрована ли запись или нет можно проверить с помощью RarEntry::isEncrypted().
Возвращаемые значения
Обработчик или false, если возникла ошибка.
Список изменений
| Версия | Описание |
|---|---|
| PECL rar 3.0.0 | Поддержка RAR-архивов с дублирующимися именами записей теперь работает нормально. |
Смотрите также
- RarEntry::extract() - Извлекает элемент из архива
- обёртка
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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает имя элемента массива (вместе с путём).
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает имя элемента в виде строки, или 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает атрибуты элемента архива, зависящие от операционной системы.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает атрибуты или false в случае возникновения ошибки.
Смотрите также
- RarEntry::getHostOs() - Возвращает оригинальную ОС элемента
- Константы RarEntry
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает код оригинальной операционной системы, в которой был создан элемент архива.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает код ОС, или false в случае возникновения ошибки.
Смотрите также
- RarEntry::extract() - Извлекает элемент из архива
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает шестнадцатеричное строковое представление 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Метод возвращает время последнего изменения элемента.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Метод возвращает в виде строки в формате 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает размер сжатого элемента архива.
Замечание:
Учтите, что на платформах с 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает размер элемента архива в распакованном состоянии.
Замечание:
Учтите, что на платформах с 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Метод 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Возвращает минимальную версию программы 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Проверяет, является ли текущая запись директорией.
Список параметров
Сигнатура функции не содержит параметров.
Примечания
Функция доступна с версии 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Проверяет, зашифрована ли текущая запись.
Замечание:
В одном и том же архиве для разных файлов могут использоваться разные пароли.
Список параметров
Сигнатура функции не содержит параметров.
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Если аргумент задан как true, то, вместо выдачи предупреждения и возврата
ошибки, библиотека UnRAR будет выбрасывать исключение типа RarException
в случае возникновения ошибки.
Также исключения будут выброшены в случае следующих ошибок, произошедших вне библиотеки (их код возврата должен быть равен -1):
-
попытка произведения действий с закрытым объектом RarArchive или объектом RarEntry относящегося к первому;
-
попытка извлечь отсутствующую запись с помощью RarArchive::getEntry().
Список параметров
Возвращаемые значения
Функция не возвращает значения после выполнения.
Смотрите также
- 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Проверяет, будут ли функции RAR выбрасывать исключения или возвращать ошибки и вызывать предупреждения в большинстве случаев (не включая некоторые программные ошибки вроде передачи аргументов некорректных типов).
Список параметров
Сигнатура функции не содержит параметров.
Смотрите также
- 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 или более поздняя версия. Сохранены правила, параметры, возвраты, ограничения и таблицы; изменены оформление и ссылки, старые условные иллюстрации заменены оригинальными проектами.
Описание
Функцию пока не задокументировали; для знакомства доступен только список аргументов.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Следующая ступень: полный приём документов в новую папку. Результат проверяется отдельным 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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


