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

Дерево руководства
Глава 107 · Практика
Phar, PharData и PharFileInfo: документы и PHP-приложения
Полный официальный Phar: от одной строки в TAR до собственной программы, сжатия, метаданных, подписей и HTTP.
Первый результат: чек внутри TAR
Нужно передать несколько документов одним файлом. Начнём с архива данных TAR: он хранит имена и байты, но не запускает программу. PharData позволяет создать такой контейнер и прочитать чек без установки отдельного архиватора.
$archive = new PharData(...) создаёт объект для выбранного файла; __DIR__ означает папку PHP-скрипта. Запись $archive["receipt.txt"] = ... кладёт строку под именем внутри контейнера. Чтение тех же квадратных скобок даёт объект записи, а ->getContent() возвращает текст. echo выводит его; \n переводит строку.
<?php
declare(strict_types=1);
$archive = new PharData(__DIR__ . '/receipt.tar');
$archive['receipt.txt'] = "Заказ 42: готов к выдаче\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42: готов к выдаче
Запуск в новой распакованной папке: php example.php. Там остаётся receipt.tar с receipt.txt. Это собственные известные данные; при реальном приёме ниже добавлены проверки и понятные отказы.
- receipt.tar: внешний файл на диске
- receipt.txt: имя записи внутри TAR
- Заказ 42: готов к выдаче — байты записи
- getContent возвращает исходный текст
| Нужно | Что выбрать |
|---|---|
| Передать документы в TAR/ZIP | PharData: данные, без исполняемого stub. |
| Передать программу PHP одним файлом | Phar: собственный загрузчик и внутренний код. Запуск архива выполняет PHP. |
| Работать с одним документом внутри | PharFileInfo, полученный как $archive["receipt.txt"]. |
| Потоковое чтение без извлечения | phar://<путь к контейнеру>/receipt.txt — локальная обёртка. |
Аналогия с папкой объясняет имена, но архив не является обычной папкой ОС: изменение может потребовать перезаписать контейнер; права/форматы/сжатие имеют отдельные ограничения. require чужого .phar выполняет чужой код. Для импорта документов выбирайте данные и проверяйте их как данные.
Полные исходники карточек и команда запуска
Каждый архив карточки самостоятельный: example.php, bootstrap.php и два UTF-8 файла input. Все пути задаёт программа. Распакуйте в новую папку, затем выполните php -d phar.readonly=0 example.php. Флаг нужен только отдельному процессу сборки исполняемого Phar; общий php.ini не меняется. Для обычного PharData запись данных работает и с phar.readonly=1 — это проверяется проектом ниже.
| Файл | Полный исходный текст |
|---|---|
| input/receipt.txt | Заказ 42 Кисть — 2 шт. Итого: 300 руб. |
| input/notice.txt | Получить заказ в пункте № 3. |
В bootstrap.php foreach перебирает два имени. addFile получает путь источника и имя внутри контейнера. Исключение прерывает ошибочный путь; исходники не удаляются. Для PharData тот же шаблон использует new PharData и orders.zip; отдельные карточки сжатия целого контейнера используют orders.tar.
<?php
$path = __DIR__ . '/orders.phar';
if (file_exists($path)) { throw new RuntimeException('Запускайте пример в новой папке'); }
$archive = new Phar($path);
foreach (['receipt.txt', 'notice.txt'] as $name) {
$archive->addFile(__DIR__ . '/input/' . $name, $name);
}
Полный обмен документами: TAR.GZ и безопасное чтение
Отправитель приложил два документа; получатель должен получить received/receipt.txt и received/notice.txt. Создаём настоящий orders.tar, сжимаем в orders.tar.gz, читаем архив напрямую через PharData и сохраняем только два разрешённых файла. Весь пример запускается с php -d phar.readonly=1 example.php: обычные данные разрешено создавать и при защите исполняемых Phar.
import.php определяет receiveDocuments(path, destination): void. Проверки идут до создания папки: вход до32КиБ, ровно две записи, точные имена, обычные файлы без ссылок, каждый до1024байт. Чтение 1025байт обнаруживает превышение. rb читает байты, xb создаёт новый файл с отказом при существующем имени; finally закрывает поток при любом исходе. foreach пишет только константные имена. При ошибке записи catch удаляет только файлы, которые создал этот вызов в своей новой папке.
<?php
function receiveDocuments(string $path, string $destination): void {
if (!is_file($path)) { throw new RuntimeException('Нет файла поставки'); }
$bytes = filesize($path);
if ($bytes === false || $bytes > 32768) { throw new RuntimeException('Слишком большой вход'); }
if (file_exists($destination)) { throw new RuntimeException('Папка результата уже существует'); }
$archive = new PharData($path);
if ($archive->count() !== 2) { throw new RuntimeException('Нужны ровно два документа'); }
$documents = [];
foreach (['receipt.txt', 'notice.txt'] as $name) {
if (!isset($archive[$name])) { throw new RuntimeException('Неожиданный состав архива'); }
$entry = $archive[$name];
if (!$entry->isFile() || $entry->isLink() || $entry->getSize() > 1024) {
throw new RuntimeException('Нужен небольшой обычный файл');
}
$stream = fopen($entry->getPathname(), 'rb');
if ($stream === false) { throw new RuntimeException('Документ не открывается'); }
try { $text = stream_get_contents($stream, 1025); }
finally { fclose($stream); }
if ($text === false || strlen($text) > 1024 || strlen($text) !== $entry->getSize()) {
throw new RuntimeException('Документ повреждён или превышает лимит');
}
$documents[$name] = $text;
}
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;
}
}
Ниже example.php: создаёт входы, вызывает receiveDocuments и печатает реальные сохранённые файлы. Следующий foreach проверяет четыре заданных отказа; catch выбирает сообщение человеку. Полный import.php и input вложены в ZIP. Уже существующая received защищена от повторной поставки.
<?php
declare(strict_types=1);
require __DIR__ . '/import.php';
$archive = new PharData(__DIR__ . '/orders.tar');
foreach (['receipt.txt', 'notice.txt'] as $name) {
$archive->addFile(__DIR__ . '/input/' . $name, $name);
}
$packed = $archive->compress(Phar::GZ);
if ($packed === null) { throw new RuntimeException('Нет orders.tar.gz'); }
receiveDocuments($packed->getPath(), __DIR__ . '/received');
echo "received/receipt.txt:\n", file_get_contents(__DIR__ . '/received/receipt.txt');
echo "received/notice.txt:\n", file_get_contents(__DIR__ . '/received/notice.txt');
$wrong = new PharData(__DIR__ . '/wrong.tar');
$wrong['other.txt'] = 'Неожиданный документ';
$wrong['notice.txt'] = 'Памятка';
$large = new PharData(__DIR__ . '/large.tar');
$large['receipt.txt'] = str_repeat('x', 1025);
$large['notice.txt'] = 'Памятка';
file_put_contents(__DIR__ . '/broken.tar', 'Это текст, а не TAR');
foreach (['wrong.tar', 'large.tar', 'broken.tar', 'missing.tar'] as $name) {
try { receiveDocuments(__DIR__ . '/' . $name, __DIR__ . '/rejected'); }
catch (UnexpectedValueException $error) { echo $name, ": Не удалось открыть исправный TAR/ZIP\n"; }
catch (RuntimeException $error) { echo $name, ': ', $error->getMessage(), "\n"; }
if (file_exists(__DIR__ . '/rejected')) { throw new RuntimeException('Отказ оставил результат'); }
}
try { receiveDocuments($packed->getPath(), __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.tar: Неожиданный состав архива
large.tar: Нужен небольшой обычный файл
broken.tar: Не удалось открыть исправный TAR/ZIP
missing.tar: Нет файла поставки
Повторная поставка: Папка результата уже существует
Сохранённый чек не изменился:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Папка received — приватный staging вне web root; выдавать результат приложению можно после успешного возврата функции. Для недоверенного сжатого контейнера сам Phar может тратить ресурсы при открытии: лимит нашего чтения не заменяет ограничения памяти/времени/процесса и входную квоту. Содержимое не исполняется, метаданные не десериализуются, вложенные архивы рекурсивно не распаковываются.
Полное приложение: сборка, stub и фактический запуск
Теперь другая задача: выдать собственную PHP-программу как один app.phar. Файлы source/main.php и source/stub.php находятся в архиве примера; сборщик помещает main.php и receipt.txt внутрь app.phar и устанавливает stub. После сборки для запуска достаточно php app.phar. Ни один внешний сервис не вызывается.
main.php читает receipt.txt относительно своей внутренней папки и выводит чек. Stub сначала вызывает mapPhar, затем require внутреннего main.php. __HALT_COMPILER(); обязательно завершает PHP-часть: после неё начинается бинарный контейнер. В stub __FILE__ — внешнее имя app.phar, а в main.php __DIR__ — внутренняя phar:// папка.
source/main.php
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
$archive->setSignatureAlgorithm(Phar::SHA256);
echo "app.phar собран; запуск собственного приложения:\n";
require $path;
Ожидаемый результат
app.phar собран; запуск собственного приложения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В демонстрации require запускает собранный пакет в текущем процессе; отдельно php app.phar выдаёт только текст чека. Сборка с phar.readonly=0 и эксплуатация с phar.readonly=1 разделены. Подпись SHA256 обнаруживает повреждение, но не удостоверяет издателя. Проверяйте происхождение кода до require.
При повреждённом архиве конструктор/загрузчик должен отказать, а не продолжать работу. При неверном стартовом имени standard stub не найдёт main.php. На следующей ступени webPhar выдаёт PHP-страницу и статический текст по localhost, а mount показывает внешнюю настройку, не упакованную в приложение.
Следующие ситуации: потоки, дерево файлов, защита и повреждение
Следующие небольшие расширения отвечают на разные реальные задачи. Каждый архив самостоятельный; данные чека и bootstrap.php включены. Подписи параметров сохранены в карточках, а здесь видно, когда выбирать поток, итератор, контекст или обработку отказа.
Открытый поток можно передать offsetSet: fopen(..., "rb") создаёт дескриптор чтения, try/finally гарантирует fclose после копирования. Так не нужно сначала получать весь большой источник через file_get_contents в одну строку.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$stream = fopen(__DIR__ . '/input/receipt.txt', 'rb');
if ($stream === false) { throw new RuntimeException('Нет исходника'); }
try { $archive->offsetSet('stream-copy.txt', $stream); }
finally { fclose($stream); }
echo $archive['stream-copy.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Скопированы байты потока, а не строка с его путём. Поток не становится собственностью получателя; вызывающий код закрывает его после операции.
DirectoryIterator возвращает SplFileInfo для элементов папки. RecursiveDirectoryIterator и RecursiveIteratorIterator обходят вложенные элементы; SKIP_DOTS пропускает . и ... Для такой формы buildFromIterator второй аргумент baseDirectory обязателен: он определяет, какую часть внешнего пути убрать из имени записи.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$base = __DIR__ . '/input';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($base, FilesystemIterator::SKIP_DOTS));
$mapping = $archive->buildFromIterator($iterator, $base);
ksort($mapping);
foreach ($mapping as $inside => $disk) { echo $inside, ":\n", $archive[$inside]->getContent(); }
Ожидаемый результат
notice.txt:
Получить заказ в пункте № 3.
receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В готовых именах отсутствует абсолютный путь вашего компьютера. Итератор передаёт объекты SplFileInfo; другая поддерживаемая форма — пары внутреннее имя => путь, разобранные в карточке.
Контекст — массив настроек конкретной потоковой операции. Здесь секция phar задаёт compress и metadata; четвёртый аргумент file_put_contents передаёт контекст, третий 0 оставляет обычные флаги записи. Не добавляйте FILE_APPEND: обёртка Phar не поддерживает дописывание.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$context = stream_context_create(['phar' => ['compress' => Phar::GZ, 'metadata' => ['title' => 'Квитанция']]]);
$text = "Заказ 42: выдан\n";
$url = 'phar://' . $path . '/delivery.txt';
if (file_put_contents($url, $text, 0, $context) !== strlen($text)) { throw new RuntimeException('Не записана квитанция'); }
$entry = $archive['delivery.txt'];
$metadata = $entry->getMetadata(['allowed_classes' => false]);
echo $metadata['title'], ":\n", $entry->getContent();
Ожидаемый результат
Квитанция:
Заказ 42: выдан
Настройки действуют на delivery.txt; они не сжимают контейнер целиком. Все собственные данные заданы в примере; для внешних метаданных нужна проверка структуры после десериализации.
Защиту записи можно включить внутри процесса, если при запуске разрешили сборку. После ini_set("phar.readonly", "1") попытка изменить исполняемый архив должна завершиться исключением. Обычный PharData продолжает работать с данными.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
ini_set('phar.readonly', '1');
try { $archive['receipt.txt'] = 'Нежелательная замена'; }
catch (BadMethodCallException $error) { echo "Изменение исполняемого пакета запрещено\n"; }
echo $archive['receipt.txt']->getContent();
$data = new PharData(__DIR__ . '/delivery.tar');
$data['delivery.txt'] = "Данные выдачи записаны отдельно\n";
echo $data['delivery.txt']->getContent();
Ожидаемый результат
Изменение исполняемого пакета запрещено
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Данные выдачи записаны отдельно
Прежний чек не меняется. Возможность изменить данные PharData не разрешает добавлять stub/alias; перед превращением в исполняемый формат снова действуют правила Phar.
Повреждённый контейнер, неверный загрузчик и отсутствующий исходный файл — три разные причины отказа. В демонстрации catch Exception собирает понятный текст для человека, а точную техническую причину сохраняет в diagnostic.txt внутри своей папки.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$diagnostics = [];
file_put_contents(__DIR__ . '/broken.phar', 'Повреждённая поставка');
try { new Phar(__DIR__ . '/broken.phar'); }
catch (Exception $error) { $diagnostics[] = $error->getMessage(); echo "Повреждённый контейнер отклонён\n"; }
try { $archive->setStub('<?php echo 42;'); }
catch (Exception $error) { $diagnostics[] = $error->getMessage(); echo "Загрузчик без __HALT_COMPILER отклонён\n"; }
try { $archive->addFile(__DIR__ . '/missing.txt', 'missing.txt'); }
catch (Exception $error) { $diagnostics[] = $error->getMessage(); echo "Отсутствующий исходник отклонён\n"; }
file_put_contents(__DIR__ . '/diagnostic.txt', implode("\n", $diagnostics));
echo "Исходный чек доступен:\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Повреждённый контейнер отклонён
Загрузчик без __HALT_COMPILER отклонён
Отсутствующий исходник отклонён
Исходный чек доступен:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Общий catch здесь намерен: разные операции бросают разные потомки Exception. В рабочем интерфейсе технический путь не выдаётся человеку; diagnostic.txt демонстрирует отдельную диагностику. Это не обещание транзакционности произвольной серии изменений.
Bzip2 — отдельная зависимость. В следующем опыте явно требуется bz2; если расширения нет, пример не следует объявлять выполненным. Способ сжатия контейнера не меняет текст документов.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if (!Phar::canCompress(Phar::BZ2)) { throw new RuntimeException('Нужно расширение bz2'); }
$packed = $archive->compress(Phar::BZ2);
if ($packed === null) { throw new RuntimeException('Нет сжатой поставки'); }
echo $packed['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Создаётся orders.tar.bz2; исходный orders.tar сохраняется. Можно читать сжатый контейнер напрямую через PharData, не вызывая внешний bunzip2.
Настоящая подпись: свежий процесс и правильный открытый ключ
Хеш SHA256 может пересчитать любой изменивший архив. Асимметричная подпись использует закрытый ключ издателя; получатель проверяет её доверенным открытым ключом. Здесь обе стороны локальны: создаём одноразовую учебную пару и уже знаем правильный открытый ключ. В реальной поставке источник доверия к ключу должен быть отдельным от скачанного архива.
Для примера нужен openssl и приложенный openssl.cnf. openssl_pkey_new создаёт RSA-пару, openssl_pkey_export возвращает закрытую PEM-строку в $private, get_details()["key"] даёт открытую PEM-часть. Закрытая часть не выводится и не сохраняется в документе. Phar::OPENSSL_SHA256 выбирает подпись с SHA256. Правильное имя файла открытого ключа — signed.phar.pubkey рядом с signed.phar.
Чтобы проверка действительно прочитала файл заново, reader.php запускается отдельным PHP-процессом: у Phar есть кеш контейнеров в памяти. proc_open получает массив аргументов, без shell-строки; PHP_BINARY выбирает тот же исполнитель, -c — ту же конфигурацию, -d включает readonly только читателю. Три pipe означают stdin/stdout/stderr. После чтения потоков проверяются пустой stderr и код завершения0.
reader.php:
<?php
try {
$archive = new Phar(__DIR__ . '/signed.phar');
echo "Доверенный в этом опыте ключ подтвердил поставку:\n";
echo $archive['receipt.txt']->getContent();
} catch (UnexpectedValueException $error) {
echo "Ключ не подтвердил поставку; документ не используется\n";
}
<?php
declare(strict_types=1);
$options = ['config' => __DIR__ . '/openssl.cnf', 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'private_key_bits' => 2048];
$key = openssl_pkey_new($options);
if ($key === false || !openssl_pkey_export($key, $private, null, $options)) {
throw new RuntimeException('Не создан учебный ключ');
}
$details = openssl_pkey_get_details($key);
if ($details === false) { throw new RuntimeException('Нет открытого ключа'); }
$path = __DIR__ . '/signed.phar';
file_put_contents($path . '.pubkey', $details['key']);
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->setSignatureAlgorithm(Phar::OPENSSL_SHA256, $private);
unset($archive);
function readInFreshProcess(): void {
$command = [PHP_BINARY];
$ini = php_ini_loaded_file();
if ($ini !== false) { $command[] = '-c'; $command[] = $ini; }
array_push($command, '-d', 'phar.readonly=1', __DIR__ . '/reader.php');
$pipes = [];
$process = proc_open($command, [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes);
if (!is_resource($process)) { throw new RuntimeException('Не запущен отдельный читатель'); }
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]); fclose($pipes[1]);
$errors = stream_get_contents($pipes[2]); fclose($pipes[2]);
$exit = proc_close($process);
if ($exit !== 0 || $errors !== '' || $output === false) { throw new RuntimeException('Ошибка процесса чтения'); }
echo $output;
}
readInFreshProcess();
$otherKey = openssl_pkey_new($options);
if ($otherKey === false) { throw new RuntimeException('Нет другого учебного ключа'); }
$otherDetails = openssl_pkey_get_details($otherKey);
if ($otherDetails === false) { throw new RuntimeException('Нет другой открытой части'); }
file_put_contents($path . '.pubkey', $otherDetails['key']);
readInFreshProcess();
file_put_contents($path . '.pubkey', $details['key']);
echo "Правильный открытый ключ восстановлен для дальнейшего чтения\n";
Ожидаемый результат
Доверенный в этом опыте ключ подтвердил поставку:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Ключ не подтвердил поставку; документ не используется
Правильный открытый ключ восстановлен для дальнейшего чтения
Второй ключ намеренно неверный; второй свежий процесс отклоняет архив до использования чека. В конце правильная открытая часть восстановлена, signed.phar можно повторно прочитать через reader.php. Пара ключей создана только для этого локального опыта; здесь не меняется системное хранилище доверия и не выдаётся настоящий сертификат.
Опубликованная рядом .pubkey сама по себе не подтверждает издателя: злоумышленник мог подменить оба файла. Закрепите доверенный ключ или проверяйте его по независимому каналу. Для получателя обычно сохраняют phar.readonly=1; подпись не делает безопасным неизвестное PHP-приложение.
Зачем нужны Phar и архивы данных
Программа и набор документов могут иметь один контейнер, но разные последствия использования. Наш TAR из первого урока читается как данные; app.phar из проекта запускает PHP. Нативный формат, TAR и ZIP поддерживают разные сочетания возможностей.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Phar
Введение
Модуль phar предоставляет возможность поместить целое PHP-приложение в один-единственный файл c именем phar (PHP Archive) для простого распространения и установки. Помимо этого, модуль phar предоставляет метод абстракции формата файла для создания и обработки архивов tar и zip через класс PharData, примерно как PDO обеспечивает единый интерфейс для доступа к различным базам данных. В отличие от PDO, который не может конвертировать между различными базами данных, Phar может конвертировать данные между форматами tar, zip и phar всего одной строкой кода. Смотрите Phar::convertToExecutable() для примера.
Что же такое phar? Phar-архивы лучше всего можно охарактеризовать как удобный способ группировки нескольких файлов в один. Также phar архив предоставляет возможность распространять целое PHP-приложение в одном единственном файле и запускать его прямо из этого файла без необходимости распаковывать его на диск. Кроме того, phar-архивы могут выполняться PHP с той же лёгкостью, что и любые другие файлы, как из командной строки, так и через веб-сервер. Phar - это как флеш-накопитель для PHP-приложений.
Phar реализует эту функциональность через потоки. Обычно, чтобы использовать в PHP-скрипте внешний файл, вы бы воспользовались, например, include:
PHP может рассматривать это как преобразование /path/to/external/file.php
в обёртку потока file:///path/to/external/file.php, а
в действительности он использует потоковые функции обёртки простого файлового потока
для доступа ко всем локальным файлам.
Чтобы использовать файл file.php, находящийся внутри phar-архива
/path/to/myphar.phar, используется синтаксис очень похожий
на синтаксис file:// выше.
На самом деле, можно рассматривать phar-архив как если бы это был внешний диск, используя любые fopen()-подобные функции, opendir() и mkdir()-подобные функции для чтения, изменения, или создания новых файлов и директорий внутри phar-архива. Это позволяет целому PHP-приложению распространяться в одном файле и запускаться прямо из этого файла.
Наиболее часто используемое применение для phar-архива - это распространение целого приложения в одном файле. Например, установщик PEAR, который поставляется вместе с PHP, является phar-архивом. Для использования phar-архива распространяемого таким способом, архив может быть выполнен через консоль или через веб-сервер.
Phar-архивы могут распространяться как архивы tar и zip,
или как пользовательский формат файла phar, предназначенный специально для
модуля phar. Каждый формат файла имеет как преимущества, так и недостатки. Форматы tar и
zip могут быть прочитаны или извлечены любой сторонней утилитой которая может работать с
этими форматами. Но чтобы PHP мог их запускать, ему будет необходим модуль phar. Файлы в
phar-формате настраиваются и уникальны для модуля phar, и могут быть созданы только им или
PEAR-пакетом » PHP_Archive.
Но их преимущество в том, что приложения, созданные в этом формате, будут работать, даже если
модуль phar не включён.
Другими словами, даже если модуль phar отключён, phar-архив всё равно может быть выполнен или подключён. Доступ к отдельным файлам в архиве возможен только с модулем phar, если только архив не был создан с помощью PHP_Archive.
Модуль phar также способно конвертировать phar-архив из tar в zip или в phar-формат одной командой:
Phar может сжимать отдельные файлы или архив целиком с использованием gzip-компрессии или bzip2-компрессии, а также автоматически проверять целостность архива, используя сигнатуры MD5, SHA-1, SHA-256 или SHA-512.
Наконец, модуль Phar заботится о вашей безопасности и отключает доступ на запись
для исполняемых phar-архивов по умолчанию, а также требует отключения на системном
уровне настройки phar.readonly в php.ini для создания или изменения
phar-архивов. Обычные неисполняемые архивы tar и zip, всегда могут быть созданы или
изменены с помощью класса PharData.
Если вы создаёте приложение с целью распространения, вы, возможно, захотите прочитать раздел Как создавать Phar-архивы. Если вам нужно больше информации об отличиях между тремя поддерживаемыми phar форматами файлов, вам следует прочитать раздел Phar, Tar и Zip.
Если вы используете phar-приложение, то полезные советы находятся в разделе Как использовать phar-архивы.
Слово phar - это сокращение от PHP и
Archive, и оно частично основано на jar
(Java Archive), знакомом Java-разработчикам.
Реализация Phar-архивов основана на PEAR-пакете » PHP_Archive, и детали реализации схожи, хотя модуль Phar гораздо мощнее. Кроме того, модуль Phar позволяет большинству PHP-приложений запускаться без изменений, тогда как phar-архивы, основанные на PHP_Archive, часто требуют существенных изменений для работы.
- Установка и настройка
- Предопределённые константы
- Использование Phar-архивов
- Создание Phar-архивов
- Чем отличается phar от tar- или zip-архива?
- Phar — Класс Phar
- Phar::addEmptyDir — Добавляет в phar-архив пустую директорию
- Phar::addFile — Добавляет в phar-архив файл из файловой системы
- Phar::addFromString — Добавляет в phar-архив файл из строки
- Phar::apiVersion — Возвращает версию API
- Phar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории
- Phar::buildFromIterator — Создаёт phar-архив из итератора
- Phar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
- Phar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::compressFiles — Сжимает все файлы в текущем Phar-архиве
- Phar::__construct — Создаёт объект Phar-архива
- Phar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл
- Phar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла
- Phar::copy — Копирует файл внутри phar-архива в новый файл внутри phar-архива
- Phar::count — Возвращает количество записей (файлов) в Phar-архиве
- Phar::createDefaultStub — Создать заглушку в формате phar-архива
- Phar::decompress — Распаковывает весь Phar-архив
- Phar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве
- Phar::delMetadata — Удаляет глобальные метаданные в phar-архиве
- Phar::delete — Удаляет файл в phar-архиве
- Phar::__destruct — Уничтожает объект архива Phar
- Phar::extractTo — Извлечь содержимое phar-архива в директорию
- Phar::getAlias — Получить псевдоним для Phar
- Phar::getMetadata — Извлечь метаданные phar-архива
- Phar::getModified — Определить, изменялся phar-архив
- Phar::getPath — Получить реальный путь к Phar-архиву на диске
- Phar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
- Phar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива
- Phar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива
- Phar::getVersion — Получить версию Phar-архива
- Phar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные
- Phar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
- Phar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
- Phar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
- Phar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива
- Phar::isWritable — Проверяет, можно ли модифицировать phar-архив
- Phar::loadPhar — Загрузить phar-архив с псевдонимом
- Phar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
- Phar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
- Phar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
- Phar::offsetExists — Определить, есть ли файл в архиве
- Phar::offsetGet — Получить объект PharFileInfo для конкретного файла
- Phar::offsetSet — Изменение содержимого файла
- Phar::offsetUnset — Удалить файл из phar-архива
- Phar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива
- Phar::setAlias — Установить псевдоним для Phar-архива
- Phar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
- Phar::setMetadata — Установить метаданные phar-архива
- Phar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
- Phar::setStub — Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
- Phar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
- Phar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск
- Phar::unlinkArchive — Удаляет архив из памяти и с диска
- Phar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве
- PharData — Класс PharData
- PharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив
- PharData::addFile — Добавить существующие файлы к tar/zip-архиву
- PharData::addFromString — Добавляет файл из строки в архив tar/zip
- PharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории
- PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
- PharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- PharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве
- PharData::__construct — Конструктор объекта PharData
- PharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив
- PharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив
- PharData::copy — Копирует файл внутри tar- или zip-архива в новый файл внутри того же архива
- PharData::decompress — Распаковать весь Phar-архив
- PharData::decompressFiles — Распаковывает все файлы в текущем zip-архиве
- PharData::delMetadata — Удаляет глобальные метаданные zip-архива
- PharData::delete — Удаляет файл в tar- или zip-архиве
- PharData::__destruct — Уничтожает неисполняемый объект архива tar или zip
- PharData::extractTo — Извлечь содержимое tar/zip-архива в директорию
- PharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив
- PharData::offsetSet — Изменение содержимого файла
- PharData::offsetUnset — Удалить файл из tar/zip-архива
- PharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)
- PharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
- PharData::setMetadata — Установить метаданные phar-архива
- PharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
- PharData::setStub — Функция-пустышка: метод setStub допустим только для объектов Phar, но не PharData
- PharFileInfo — Класс PharFileInfo
- PharFileInfo::chmod — Установка прав доступа
- PharFileInfo::compress — Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::__construct — Конструктор объекта PharFileInfo
- PharFileInfo::decompress — Распаковывает Phar-файл в phar-архиве
- PharFileInfo::delMetadata — Удаляет метаданные отдельного файла в архиве
- PharFileInfo::__destruct — Уничтожает входной объект Phar
- PharFileInfo::getCRC32 — Получить контрольную сумму CRC32
- PharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::getContent — Получить полное содержимое файла записи
- PharFileInfo::getMetadata — Получить метаданные, связанные с файлом
- PharFileInfo::getPharFlags — Получить флаги файла в phar-архиве
- PharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные
- PharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC
- PharFileInfo::isCompressed — Проверить, сжат ли файл
- PharFileInfo::setMetadata — Установка метаданных для конкретного файла
- PharException — Класс PharException
Как подготовить окружение
Сначала выясните, какой php.exe запускает сборку, затем проверьте загрузку Phar и нужных кодеков. php --ini показывает конфигурацию конкретного процесса; php --ri Phar — настройки расширения. Наличие Phar не отключает защиту записи исполняемых пакетов.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Зависимости сжатия и подписи
Обычный TAR читается без gzip/Bzip2. Для orders.tar.gz нужен zlib; для Bzip2 нужен bz2; для асимметричной подписи OpenSSL нужен openssl. Возможность чтения уже сжатых записей тоже зависит от декодера.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Требования
Кроме того, вы можете подключить модули zlib и bzip2, чтобы воспользоваться поддерживаемой компрессией phar. Также, чтобы иметь возможность подписывания OpenSSL, должен быть подключён модуль OpenSSL.
Если zend.multibyte включён, то необходимо также включить zend.detect_unicode.
Встроенный модуль и отдельный процесс сборки
Phar входит в стандартную сборку PHP, но его могли отключить. Параметр --disable-phar относится к сборке самого PHP, а не к вашему example.php. Наши команды -d изменяют только один запуск и не требуют править серверный php.ini.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Установка
Модуль Phar поставляется с PHP и по умолчанию включён. Для отключения поддержки Phar, используйте --disable-phar.
Модуль может быть установлен из репозитория PECL. Более подробные сведения и история версий доступны на » странице Phar в репозитории PECL.
Три настройки: запись, обязательный хеш и кеш
phar.readonly=1 защищает создание/изменение исполняемого контейнера; обычный PharData остаётся доступен для данных. phar.require_hash проверяет присутствие механизма целостности, но не доверие издателю. phar.cache_list загружает указанные архивы при старте процесса; менять кешируемую поставку во время работы не следует.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Настройка во время выполнения
Поведение функций зависит от установок в файле php.ini.
| Имя | По умолчанию | Место изменения | Список изменений |
|---|---|---|---|
| phar.readonly | "1" | INI_ALL |
|
| phar.require_hash | "1" | INI_ALL |
|
| phar.cache_list | "" | INI_SYSTEM |
Краткое разъяснение конфигурационных директив.
-
phar.readonlybool -
Этот параметр отключает поддержку создания или модификации Phar-архивов с помощью потока
pharи записи объектов Phar на диск. Этот параметр всегда должен быть включён на рабочих машинах, поскольку поддержка записи модулем phar позволила бы простое создание, основанных на PHP, вирусов в случае присутствия других уязвимостей в системе общей безопасности.Замечание:
Этот параметр может быть отключён в php.ini только исходя из соображений безопасности. Если параметр
phar.readonlyотключён в php.ini, пользователь может включитьphar.readonlyв скрипте или отключить его позже. Если параметрphar.readonlyвключён в php.ini, скрипт может безвредно "повторно включить" переменную INI, но не может отключить её. -
phar.require_hashbool -
Этот параметр сделает обязательной какую-либо подпись (в настоящий момент поддерживаются MD5, SHA1, SHA256, SHA512 и OpenSSL) для всех открываемых Phar-архивов и сделает невозможной обработку любого Phar-архива, не содержащего подпись.
Замечание:
Этот параметр может быть отключён в php.ini. Если параметр
phar.require_hashотключён в php.ini, пользователь может включитьphar.require_hashв скрипте или отключить его позже. Если параметрphar.require_hashвключён в php.ini, скрипт может безвредно "повторно включить" переменную INI, но не может отключить её.Этот параметр не влияет на чтение простых tar-файлов при помощи класса PharData.
Предостережениеphar.require_hashне обеспечивает безопасности как таковой - это всего лишь мера по защите от запуска повреждённого Phar архива, поскольку кто угодно, имеющий возможность модифицировать архив может с тем же успехом модифицировать и подпись. -
phar.cache_liststring -
Позволяет проводить разметку phar-архивов, для которых необходимо осуществить предварительный разбор в момент старта веб-сервера. Обеспечивает повышение производительности за счёт запуска файлов вне phar-архива со скоростью, очень близкой к той, которая была бы при запуске этих файлов традиционным способом с диска.
Поток phar:// и объекты
fopen возвращает поток, который закрывают fclose; Phar представляет весь контейнер, PharFileInfo — одну запись. Эти объекты и ресурс потока выполняют разные задачи. phar:// путь внутри архива отличается от пути orders.phar на диске.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Типы ресурсов
Модуль Phar предоставляет поток phar, который позволяет
прозрачно обращаться к файлам внутри phar-архива. Смотрите также
описание формата Phar-файла.
Константы по задачам
Phar::TAR выбирает формат, Phar::GZ — алгоритм сжатия, Phar::SHA256 — проверку целостности. Одинаково выглядящие целые значения из разных групп не взаимозаменяемы: методу передают константу его категории. OPENSSL_SHA256 и OPENSSL_SHA512 — отдельные алгоритмы подписи, а PHP/PHPS относятся только к MIME-маршрутизации webPhar.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Предопределённые константы
Следующие константы определяются модулем и доступны, только если модуль либо собрали в PHP, либо динамически загрузили при выполнении кода.
| Константа | Значение | Описание |
|---|---|---|
Phar::NONE
(int)
|
0x00000000 | без сжатия |
Phar::COMPRESSED
(int)
|
0x0000F000 | битовая маска, которая может быть использована с флагами файла для определения наличия сжатия |
Phar::GZ
(int)
|
0x00001000 | сжатие zlib (gzip) |
Phar::BZ2
(int)
|
0x00002000 | сжатие bzip2 |
| Константа | Значение | Описание |
|---|---|---|
Phar::PHAR
(int)
|
1 | формат файла phar |
Phar::TAR
(int)
|
2 | формат файла tar |
Phar::ZIP
(int)
|
3 | формат файла zip |
| Константа | Значение | Описание |
|---|---|---|
Phar::MD5
(int)
|
0x0001 | подпись с помощью алгоритма хеширования md5 |
Phar::SHA1
(int)
|
0x0002 | подпись с помощью алгоритма хеширования sha1 |
Phar::SHA256
(int)
|
0x0003 | подпись с помощью алгоритма хеширования sha256 (требуется модуль hash) |
Phar::SHA512
(int)
|
0x0004 | подпись с помощью алгоритма хеширования sha512 (требуется модуль hash) |
Phar::OPENSSL
(int)
|
0x0010 | подпись с помощью пары открытого/закрытого ключей OpenSSL. Это подлинная подпись, использующая асимметричный ключ. |
Phar::OPENSSL_SHA256
(int)
|
||
Phar::OPENSSL_SHA512
(int)
|
| Константа | Значение | Описание |
|---|---|---|
Phar::PHP
(int)
|
1 | используется для указания параметру переопределения MIME-типа Phar::webPhar() на то, что расширение должно быть разобрано как файл PHP |
Phar::PHPS
(int)
|
2 | используется для указания параметра переопределения MIME-типа Phar::webPhar(), в соответствии с которым расширение должно быть разобрано как исходный файл PHP посредством highlight_file() |
Как использовать готовый контейнер
Для документа читаем запись через объект/поток; для проверенной программы запускаем собственный stub. Путь выполнения и нужное доверие выбирают до вызова require. Два полных проекта выше демонстрируют оба пути.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Использование Phar-архивов
Содержание
От чтения файла к запуску пакета
Здесь собраны все способы применения: запуск CLI, подключение библиотеки, обход записей, буферизация, метаданные, подпись и веб-маршрутизация. Старые условные примеры с чужими архивами заменены нашим app.phar и localhost-проектом. Буферизацию не следует понимать как транзакцию базы данных: rollback в этом API нет.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Использование Phar-архивов: Введение
Концептуально Phar-архивы аналогичны JAR-архивам Java, но учитывают нужды и гибкость PHP-приложений. Phar-архив используется для распространения законченного PHP-приложения или библиотеки в виде одного файла. Приложение, имеющее вид Phar-архива, используется в точности так же, как и любое другое PHP-приложение:
Использование библиотеки, имеющей вид Phar-архива, идентично использованию любой другой PHP-библиотеки:
Обёртка потока phar представляет собой основу модуля phar,
про её использование подробно написано здесь.
Обёртка потока phar предоставляет доступ к файлам внутри phar-архива
с использованием стандартных файловых функции PHP: fopen(), opendir()
и других, которые работают с обычными файлами.
Обёртка потока phar поддерживает все операции чтения/записи
как над файлами, так и над каталогами.
Класс Phar реализует расширенные возможности по доступу к файлам и по созданию phar-архивов. Использование класса Phar подробно описано здесь.
Кроме того, проверка содержимого phar-файла может быть осуществлена с помощью любого
из поддерживаемых симметричных алгоритмов хеширования (MD5, SHA1, SHA256 и SHA512, если ext/hash включён),
а также с помощью подписывания асимметричными открытым/закрытым ключами, используя OpenSSL.
Для того чтобы использовать подписывание OpenSSL, вам необходимо сгенерировать пару из открытого и закрытого ключей
и установить закрытый ключ для подписывания, используя Phar::setSignatureAlgorithm().
Кроме того, открытый ключ, извлечённый при помощи этого кода:
должен быть сохранён рядом с phar-архивом, для проверки которого он используется.
Если phar-архив сохранён как /путь/к/моему/архиву/my.phar,
то открытый ключ должен быть сохранён как /путь/к/моему/архиву/my.phar.pubkey,
иначе phar не сможет проверить подлинность подписи OpenSSL.
Класс Phar также предоставляет 3 статических метода: Phar::webPhar(), Phar::mungServer() и Phar::interceptFileFuncs(), которые имеют решающее значение для упаковки PHP-приложений, предназначенных для использования на обычных файловых системах и для веб-приложений. Phar::webPhar() реализует фронтальный контроллер, который направляет HTTP-вызовы в правильное место внутри phar-архива. Phar::mungServer() используется для изменения значений массива $_SERVER, что позволяет обмануть приложения, обрабатывающие эти значения. Phar::interceptFileFuncs() инструктирует Phar о необходимости перехвата вызовов fopen(), file_get_contents(), opendir() и прочих функций, основанных на stat (file_exists(), is_readable() и так далее) и перенаправления всех относительных путей внутрь phar-архива.
Например, для упаковки выпуска популярного приложения phpMyAdmin
для его использования в качестве phar-архива, требуется только этот простой скрипт,
а phpMyAdmin.phar.tar.php будет доступен как обычный файл
на вашем веб-сервере после изменения значений user/password:
Читать запись без извлечения
В проекте receiveDocuments поток читает только разрешённую запись и не более1025байт. phar:// работает локально даже при отключённых allow_url_fopen/include; эта возможность не разрешает выполнять недоверенный код. Для создания удобнее объектный API. Режим append обёрткой не поддерживается.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Использование Phar-архивов: обёртка потока phar
Обёртка потока Phar полностью поддерживает fopen() для чтения и записи (не для добавления), unlink(), stat(), fstat(), fseek(), rename() и потоковые операции каталогов, такие как opendir(), rmdir() и mkdir().
Также при помощи контекстов потока можно влиять на сжатие отдельных файлов и пофайловые метаданные в Phar-архиве:
Обёртка потока phar не работает с файлами, расположенными удалённо,
и не может с ними работать, так что её использование возможно даже когда параметры INI
allow_url_fopen и
allow_url_include отключены.
Несмотря на наличие возможности создавать phar-архивы с нуля просто используя потоковые операции, лучшим решением будет использование функционала, встроенного в класс Phar. Обёртку потока лучше всего использовать только для чтения.
Уточнение вызова file_put_contents: потоковый context — четвёртый аргумент, после flags. В нашем расширенном примере использованы file_put_contents($url, $text, 0, $context) и параметры phar.compress/phar.metadata; старую условную иллюстрацию с тремя аргументами не следует копировать.
Три класса и квадратные скобки
Phar/PharData управляют контейнером, а $archive["receipt.txt"] возвращает PharFileInfo. При присваивании тем же скобкам вызывается offsetSet, при isset — offsetExists, при unset — offsetUnset. Для передачи источника можно использовать строку или открытый поток; для обхода деревьев — SPL-итератор.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Использование Phar-архивов: классы Phar и PharData
Класс Phar поддерживает чтение и обработку Phar-архивов, а также итерацию через унаследованную функциональность класса RecursiveDirectoryIterator. Благодаря поддержке интерфейса ArrayAccess, доступ к файлам внутри Phar-архива может быть получен, как если бы они были частью ассоциативного массива.
Класс PharData расширяет класс Phar и
позволяет создавать и изменять неисполняемые tar- и zip-архивы данных даже в том случае,
если параметр phar.readonly=1 в php.ini. Фактически функции
PharData::setAlias() и PharData::setStub()
отключены, поскольку концепция псевдонима и заглушки является уникальной для
исполняемых phar-архивов.
Важно отметить, что при создании Phar-архива в конструктор объекта Phar должен быть передан полный путь. Попытки инициализации объекта Phar с относительными путями потерпят неудачу.
Предположим, что $p — объект Phar, инициализированный, как показано ниже:
Пустой Phar-архив будет создан в /путь/к/myphar.phar, или,
если файл /path/to/myphar.phar уже существует, он будет открыт повторно.
Использование myphar.phar показывает концепцию псевдонима,
который может быть использован для указания на /путь/к/myphar.phar
в URL-адресах, подобно тому, как показано ниже:
С только что созданным объектом $p класса Phar
возможно следующее:
-
$a = $p['file.php']создаст объект класса PharFileInfo, который будет ссылаться на содержимоеphar://myphar.phar/file.php -
$p['file.php'] = $vсоздаст новый файл (phar://myphar.phar/file.php) или перезапишет существующий внутриmyphar.phar.$vможет быть строкой или указателем на открытый файл. В последнем случае для создания нового файла будет использовано всё содержимое открытого файла. Обратите внимание, что функционально эквивалентным этому будет вызов$p->addFromString('file.php', $v). Также имеется возможность добавления содержимого файла при помощи$p->addFile('/path/to/file.php', 'file.php'). Наконец, пустой каталог может быть создан при помощи$p->addEmptyDir('empty'). -
isset($p['file.php'])может быть использовано для определения существования файлаphar://myphar.phar/file.phpвнутриmyphar.phar. -
unset($p['file.php'])удаляет файлphar://myphar.phar/file.phpизmyphar.phar.
Кроме того, использование объекта Phar является единственным способом получить доступ к метаданным архива (через Phar::getMetadata()) и единственным способом установить или получить заглушку Phar-архива через Phar::getStub() и Phar::setStub(). К тому же, работать со сжатием целого Phar-архива можно только используя класс Phar.
Полный перечень функционала объекта Phar задокументирован ниже.
Класс PharFileInfo расширяет класс SplFileInfo и добавляет несколько методов для работы с деталями, присущими файлам, которые содержатся в Phar-архиве, такими как работа со сжатием и метаданными.
Практическое правило наших проектов — абсолютный путь через __DIR__, чтобы результат не зависел от рабочей папки. Фраза старого описания о безусловном отказе всех относительных путей не является универсальным ограничением современного конструктора; возможность зависит от разрешения пути и распознаваемого расширения.
Последовательность собственной сборки
Задайте точный состав, создайте новый контейнер, добавьте собственные файлы, установите stub, завершите запись и запустите готовый результат. Ошибка любого этапа означает незавершённую сборку, которую нельзя выдавать как готовую программу.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Отсутствующий в старой документации учебный путь
Официальная страница содержит только направления чтения. Здесь полный недостающий путь уже представлен: source/main.php + source/stub.php + input/receipt.txt → сборщик → app.phar → реальный вывод чека. Для большого набора файлов изучите buildFromDirectory/buildFromIterator, для веб-программы — webPhar.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Создание Phar-архивов: Введение
Должно быть написано в ближайшем будущем. Перед чтением этого обязательно прочитайте Как использовать Phar-архивы.
Отличным началом будет чтение про Phar::buildFromIterator() и об особенностях выбора доступного для архивов формата файла. Хорошее понимание того, что из себя представляет заглушка (stub) и что она имеет решающее значение для создания phar-архива, и поэтому Phar::setStub() и Phar::createDefaultStub() также будут хорошей отправкой точкой. Если вы распространяете веб-приложение, ключевыми будут знания о Phar::webPhar() и связанном с ним методе Phar::mungServer(). Любое приложение, которое обращается к своим собственным файлам, должно учитывать возможность использования Phar::interceptFileFuncs().
Почему Phar может быть TAR или ZIP
Формат контейнера и исполняемость не одно и то же. Обычный orders.tar — данные; TAR с загрузчиком и правилами именования может быть исполняемым Phar. Конвертация создаёт новый файл, исходник сохраняется.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Чем отличается phar от tar- или zip-архива?
Содержание
Из чего состоит исполняемый контейнер
Stub задаёт начало программы, манифест описывает записи, дальше идут их байты и данные целостности. Для данных TAR/ZIP загрузчик отсутствует. Утверждение старой краткой страницы о подписи только нативного формата ограничено историческим описанием: современная сравнительная таблица и реализация поддерживают подписи также TAR/ZIP.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Составные части всех Phar-архивов вне зависимости от формата файла
Все Phar-архивы содержат от трёх до четырёх секций:
-
заглушка
-
манифест, описывающий содержимое
-
содержимое файла
-
[необязательно] подпись для проверки целостности Phar (только для формата файла phar)
Граница PHP-загрузчика и бинарных данных
Минимальный stub — <?php __HALT_COMPILER();. Наш полноценный stub дополнительно регистрирует контейнер и запускает main.php. Маркер завершения обязателен; обычный текст после него относится уже к контейнеру, поэтому строку загрузчика нельзя конструировать из пользовательского ввода.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Заглушка Phar-файла
Заглушкой Phar является простой PHP-файл. Минимально возможная заглушка выглядит следующим образом:
Заглушка должна содержать по крайней мере лексему __HALT_COMPILER(); в конце файла.
Как правило, заглушка содержит функциональность загрузчика, подобно тому, как показано ниже:
На содержимое заглушки Phar не налагаются ограничения, за исключением того,
что она должна завершаться лексемой __HALT_COMPILER();.
Закрывающий тег PHP может быть включён или опущен,
но должно быть не более одного пробела между ?>
; и закрывающим тегом
, иначе модуль phar не сможет обработать манифест Phar-архива.
?>
В phar-архиве, основанном на tar или zip, заглушка хранится в
файле .phar/stub.php. Заглушка по умолчанию для Phar-архива,
основанного на phar, содержит приблизительно 7 килобайт кода для извлечения содержимого
Phar-архива и его выполнения. Смотрите Phar::createDefaultStub()
для более подробной информации.
В phar-архиве, основанном на tar или zip, псевдоним phar хранится в
файле .phar/alias.txt в виде простого текста.
Выбор формата по нужной операции
Нужно отдельно сжимать записи — выбирайте PHAR/ZIP. Нужен обычный TAR.GZ — сжимайте TAR целиком. Нужна запись данных при phar.readonly=1 — используйте PharData без исполняемого stub. Таблица ниже сохраняет каждое официальное отличие и оговорку.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Сравнение Phar, Tar и Zip
Что хорошего и плохого в трёх поддерживаемых форматах файла в модуле phar? В этой таблице предпринята попытка решить этот вопрос.
| Функционал | Phar | Tar | Zip |
|---|---|---|---|
| Стандартный формат файла | Нет | Да | Да |
| Возможно выполнение без модуля Phar [1] | Да | Нет | Нет |
| Пофайловое сжатие | Да | Нет | Да |
| Сжатие всего архива | Да | Да | Нет |
| Проверка подписи всего архива | Да | Да | Да |
| Поддержка веб-приложений | Да | Да | Да |
| Пофайловые метаданные | Да | Да | Да |
| Метаданные всего архива | Да | Да | Да |
| Создание/изменение архива [2] | Да | Да | Да |
| Полная поддержка всех функций - обёрток потока | Да | Да | Да |
| Может быть создан/изменён, даже если phar.readonly=1 [3] | Нет | Да | Да |
[1] Без модуля Phar PHP может получить прямой доступ к содержимому
Phar-архива только в том случае, если в нём используется заглушка,
которая извлекает содержимое phar-архива. Заглушка,
созданная при помощи Phar::createDefaultStub(), распаковывает
phar-архив и запускает его содержимое из временного каталога в том случае,
если не был найден модуль phar.
[2] Для доступа на запись требуется, чтобы был отключён параметр phar.readonly
в php.ini или непосредственно в консоли.
[3] Только архивы tar и zip без .phar в
имени файла и без исполняемой заглушки .phar/stub.php
могут быть созданы, если phar.readonly=1.
TAR: последовательный контейнер и сжатие целиком
Наш orders.tar.gz содержит два документа, а не два отдельных gzip-потока. Для USTAR важны длины путей; PAX/GNU-расширения поддерживаются ограниченно. Это следует проверить до выбора TAR для чужого экспорта.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Phar-архивы, основанные на tar
Архивы, основанные на формате файла tar, следуют более современному формату файла USTAR. Конструкция заголовка tar-файла делает их более эффективными для доступа, чем формат файла zip, и почти настолько же эффективными, как файлы формата phar. Имена файлов ограничены 255 байтами, включая полный путь к phar-архиву. Ограничений на количество файлов, содержащихся в phar-архиве, основанном на tar, нет. Эти архивы могут быть полностью сжаты в gzip или bzip2 формате и по-прежнему выполняться модулем Phar.
Существует ограниченная поддержка чтения архивов в формате обмена pax,
но все распознанные заголовки pax (в настоящее время typeflag x and
g) игнорируются.
Также имеется ограниченная поддержка архивов GNU Tar;
в настоящее время заголовки ././@LongLink разрешены.
Для сжатия всего архива используйте Phar::compress(). Для распаковки всего массива используйте Phar::decompress().
ZIP: записи, комментарии и метаданные
В ZIP отдельные документы могут иметь собственное сжатие. Phar хранит PHP-метаданные в комментариях; такой комментарий не обязан быть привычной человеку заметкой архиватора. При обмене с другими инструментами лучше явная JSON-запись с заданной схемой.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Phar-архивы, основанные на zip
Архивы, основанные на формате файла zip, поддерживают некоторые возможности,
встроенные в формат файла zip. Пофайловые и относящиеся ко всему архиву метаданные
хранятся в файловых комментариях zip и в комментарии всего zip-архива в виде сериализованных строк.
Уже существующие zip-комментарии будут успешно считаны в виде строки. Пофайловое
сжатие при чтении/записи поддерживается в случае использования сжатия zlib DEFLATE,
а в случае использования bzip2-сжатия поддерживается доступ на чтение.
Ограничений на количество файлов, содержащихся в phar-архиве, основанном на zip, нет.
Пустые каталоги хранятся в zip-архиве в виде файлов с завершающим слешем как my/directory/.
Нативный манифест: длины, версия и порядок байтов
Эта таблица нужна разработчику инструментов формата, а не первому сборщику: обычное приложение не вычисляет смещения вручную. Указание «текущая1.0.0» в исторической таблице нельзя принимать за нынешнюю версию: apiVersion/getVersion читают реальное значение; пустые директории требуют1.1.1.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Формат файла phar
Формат файла phar буквально представляет из себя заглушку/манифест/содержимое/подпись и
хранит ключевую информацию о том, что включено в phar-архив в его манифесте.
Манифест Phar — это высокооптимизированный формат, который позволяет указывать параметры сжатия файлов, доступа к файлам и даже определяемые пользователем метаданные, такие как владелец или группа файла. Все значения, превышающие 1 байт, хранятся в порядке байтов от младшего к старшему, за исключением версии API, которая по историческим причинам хранится в виде 3 полубайт в порядке от старшего к младшему.
Все неиспользованные флаги зарезервированы для использования в будущем и не должны быть использованы для хранения пользовательской информации. Используйте возможности пофайловых метаданных для хранения индивидуальной информации об отдельных файлах.
Основной формат файла манифеста Phar-архива выглядит следующим образом:
| Размер в байтах | Описание |
|---|---|
| 4 байта | Длина манифеста в байтах (предел 1 МБ) |
| 4 байта | Количество файлов в Phar-архиве |
| 2 байта | Версия API манифеста Phar (текущая 1.0.0) |
| 4 байта | Флаги глобальной битовой карты Phar |
| 4 байта | Длина псевдонима Phar |
| ?? | Псевдоним Phar (длина основана на предыдущем значении) |
| 4 байта | Длина метаданных Phar (0 в случае отсутствия) |
| ?? | Сериализованные метаданные Phar, хранящиеся в формате serialize() |
| по меньшей мере (24 * количество записей) байт | записи для каждого файла |
Общие флаги всего контейнера
Бит подписи и наличие хотя бы одной сжатой записи относятся к архиву в целом. Это не права доступа отдельного чека и не произвольное место для пользовательских данных. Собственные сведения хранят в метаданных или отдельном документе.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Флаги глобальной битовой карты Phar
Здесь представлены битовые флаги, на настоящий момент распознаваемые модулем Phar для глобальной битовой карты Phar:
| Значение | Описание |
|---|---|
0x00010000 |
Если задано, значит этот Phar содержит проверочную подпись |
0x00001000 |
Если задано, значит этот Phar содержит по меньшей мере один файл, сжатый при помощи сжатия zlib DEFLATE. |
0x00002000 |
Если задано, значит этот Phar содержит по меньшей мере один файл, сжатый при помощи bzip2-сжатия. |
Одна запись манифеста: что описывает receipt.txt
Размер до сжатия, время, размер хранения, CRC и флаги описывают конкретный документ. Большое заявленное число не разрешает программе выделять столько памяти: импорт проверяет и метаданные, и фактические прочитанные байты.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание записи файла в манифесте Phar
Каждый файл в манифесте содержит следующую информацию:
| Размер в байтах | Описание |
|---|---|
| 4 байта | Длина имени файла в байтах |
| ?? | Имя файла (длина указана в предыдущем поле) |
| 4 байта | Размер распакованного файла в байтах |
| 4 байта | Метка времени Unix файла |
| 4 байта | Размер сжатого файла в байтах |
| 4 байта | Контрольная сумма CRC32 содержимого распакованного файла |
| 4 байта | Флаги битовой карты файла |
| 4 байта | Длина сериализованных метаданных файла (0 в случае отсутствия) |
| ?? | Сериализованные метаданные файла, хранящиеся в формате serialize() |
Обратите внимание, что начиная с версии API 1.1.1 пустые каталоги хранятся
в виде файлов с завершающим слешем в их имени, как my/directory/
К распознаваемым значениям битовой карты файла относятся:
| Значение | Описание |
|---|---|
0x000001FF |
Эти биты зарезервированы для определения конкретных прав доступа файла. Права доступа используются для fstat() и могут быть использованы для воссоздания требуемых прав доступа при извлечении. |
0x00001000 |
Если задано, то этот файл сжат при помощи сжатия zlib DEFLATE. |
0x00002000 |
Если задано, то этот файл сжат при помощи bzip2-сжатия. |
Подпись в конце файла и доверенный издатель
MD5/SHA-хеши — контроль повреждения. Для удостоверения автора нужна асимметричная подпись и доверенный открытый ключ. Ключ рядом с архивом не становится доверенным только из-за имени .pubkey. Актуальные OPENSSL_SHA256/OPENSSL_SHA512 дополняют исторический OPENSSL.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Формат подписи Phar
В содержащих подпись phar-архивах подпись всегда присоединена к концу Phar-архива после загрузчика, манифеста и содержимого файлов. В настоящее время поддерживаются следующие форматы подписи: MD5, SHA1, SHA256, SHA512 и OPENSSL.
| Длина в байтах | Описание |
|---|---|
| переменная | Собственно подпись. 20 байт в случае использования подписи SHA1, 16 байт в случае использования подписи MD5, 32 байта в случае использования подписи SHA256, 64 байта в случае использования подписи SHA512. Длина подписи OPENSSL зависит от размера закрытого ключа. |
| 4 байта |
Флаги подписи. 0x0001 используется для определения подписи MD5,
0x0002 используется для определения подписи SHA1,
0x0003 используется для определения подписи SHA256,
0x0004 используется для определения подписи SHA512.
Поддержка подписей SHA256 и SHA512 была введена начиная с версии API 1.1.0.
0x0010 используется для определения подписи OPENSSL,
которая доступна с версии API 1.1.1, если доступен OpenSSL.
|
| 4 байта |
Магический GBMB используется для определения наличия подписи.
|
| Современное дополнение | Значение |
|---|---|
| Phar::OPENSSL_SHA256 | Алгоритм0x0011, подпись OpenSSL с SHA256. |
| Phar::OPENSSL_SHA512 | Алгоритм0x0012, подпись OpenSSL с SHA512. |
Класс Phar и унаследованные возможности
Phar расширяет RecursiveDirectoryIterator, поддерживает Countable и ArrayAccess. Ниже сохранён полный официальный обзор, включая унаследованные методы и константы; собственные96API разобраны индивидуально. Родительский итератор нужен для обхода, а методы Phar — для изменения контейнера.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Класс Phar
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)
Обзор класса
$filename, int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS, ?string $alias = null)$format = null, ?int $compression = null, ?string $extension = null): ?PharData$format = null, ?int $compression = null, ?string $extension = null): ?Phar$index = null, ?string $webIndex = null): string$directory, array|string|null $files = null, bool $overwrite = false): bool?string
$alias = null,?string
$index = null,?string
$fileNotFoundScript = null,array
$mimeTypes = [],?callable
$rewrite = null): void
$mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObjectСписок изменений
| Версия | Описание |
|---|---|
| 8.4.0 | Добавлена поддержка модуля меток времени эпохи Unix для архивов на основе Zip. |
| 8.0.0 | Метаданные больше не десериализуются при открытии архива, а откладываются до вызова метода Phar::getMetadata(). |
Примечания
До PHP 8.0.0 метаданные десериализовались при открытии архива, что могло привести к уязвимостям в безопасности. Начиная с PHP 8.0.0, метаданные десериализуются только при вызове метода Phar::getMetadata(), у которого есть опции для ограничения десериализации из соображений безопасности.
Содержание
- Phar::addEmptyDir — Добавляет в phar-архив пустую директорию
- Phar::addFile — Добавляет в phar-архив файл из файловой системы
- Phar::addFromString — Добавляет в phar-архив файл из строки
- Phar::apiVersion — Возвращает версию API
- Phar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории
- Phar::buildFromIterator — Создаёт phar-архив из итератора
- Phar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
- Phar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::compressFiles — Сжимает все файлы в текущем Phar-архиве
- Phar::__construct — Создаёт объект Phar-архива
- Phar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл
- Phar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла
- Phar::copy — Копирует файл внутри phar-архива в новый файл внутри phar-архива
- Phar::count — Возвращает количество записей (файлов) в Phar-архиве
- Phar::createDefaultStub — Создать заглушку в формате phar-архива
- Phar::decompress — Распаковывает весь Phar-архив
- Phar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве
- Phar::delMetadata — Удаляет глобальные метаданные в phar-архиве
- Phar::delete — Удаляет файл в phar-архиве
- Phar::__destruct — Уничтожает объект архива Phar
- Phar::extractTo — Извлечь содержимое phar-архива в директорию
- Phar::getAlias — Получить псевдоним для Phar
- Phar::getMetadata — Извлечь метаданные phar-архива
- Phar::getModified — Определить, изменялся phar-архив
- Phar::getPath — Получить реальный путь к Phar-архиву на диске
- Phar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
- Phar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива
- Phar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива
- Phar::getVersion — Получить версию Phar-архива
- Phar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные
- Phar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
- Phar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
- Phar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
- Phar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива
- Phar::isWritable — Проверяет, можно ли модифицировать phar-архив
- Phar::loadPhar — Загрузить phar-архив с псевдонимом
- Phar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
- Phar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
- Phar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
- Phar::offsetExists — Определить, есть ли файл в архиве
- Phar::offsetGet — Получить объект PharFileInfo для конкретного файла
- Phar::offsetSet — Изменение содержимого файла
- Phar::offsetUnset — Удалить файл из phar-архива
- Phar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива
- Phar::setAlias — Установить псевдоним для Phar-архива
- Phar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
- Phar::setMetadata — Установить метаданные phar-архива
- Phar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
- Phar::setStub — Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
- Phar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
- Phar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск
- Phar::unlinkArchive — Удаляет архив из памяти и с диска
- Phar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве
Класс PharData для неисполняемых данных
PharData наследует Phar, но снимает ограничение readonly для обычных TAR/ZIP. setAlias/setStub/setDefaultStub намеренно отказывают: эти операции относятся к исполняемому контейнеру. Наследование сигнатуры не гарантирует одинаковый смысл у подкласса.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Класс PharData
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)
Введение
Класс PharData предоставляет высокоуровневый интерфейс доступа и создания
неисполняемых tar- и zip-архивов. Поскольку архивы этих типов не содержат
заглушку и не могут быть выполнены модулем Phar, есть возможность создавать
и обрабатывать обычные zip- и tar-файлы, используя класс PharData, даже если
параметр phar.readonly в php.ini равен 1.
Обзор класса
string
$filename,int
$flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS,?string
$alias = null,int
$format = 0)
$format = null, ?int $compression = null, ?string $extension = null): ?PharData$format = null, ?int $compression = null, ?string $extension = null): ?Phar$directory, array|string|null $files = null, bool $overwrite = false): bool$mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObjectСодержание
- PharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив
- PharData::addFile — Добавить существующие файлы к tar/zip-архиву
- PharData::addFromString — Добавляет файл из строки в архив tar/zip
- PharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории
- PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
- PharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- PharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве
- PharData::__construct — Конструктор объекта PharData
- PharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив
- PharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив
- PharData::copy — Копирует файл внутри tar- или zip-архива в новый файл внутри того же архива
- PharData::decompress — Распаковать весь Phar-архив
- PharData::decompressFiles — Распаковывает все файлы в текущем zip-архиве
- PharData::delMetadata — Удаляет глобальные метаданные zip-архива
- PharData::delete — Удаляет файл в tar- или zip-архиве
- PharData::__destruct — Уничтожает неисполняемый объект архива tar или zip
- PharData::extractTo — Извлечь содержимое tar/zip-архива в директорию
- PharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив
- PharData::offsetSet — Изменение содержимого файла
- PharData::offsetUnset — Удалить файл из tar/zip-архива
- PharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)
- PharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
- PharData::setMetadata — Установить метаданные phar-архива
- PharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
- PharData::setStub — Функция-пустышка: метод setStub допустим только для объектов Phar, но не PharData
Класс PharFileInfo для одной записи
PharFileInfo расширяет SplFileInfo: обычные сведения о файле сочетаются с getContent, сжатием, CRC и метаданными. Экземпляр получают через $archive["receipt.txt"], поэтому сначала необходим открытый контейнер и существующее имя.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Класс PharFileInfo
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)
Введение
Класс PharFileInfo предоставляет высокоуровневый интерфейс к содержимому и атрибутам отдельного файла в phar-архиве.
Обзор класса
$mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObjectСодержание
- PharFileInfo::chmod — Установка прав доступа
- PharFileInfo::compress — Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::__construct — Конструктор объекта PharFileInfo
- PharFileInfo::decompress — Распаковывает Phar-файл в phar-архиве
- PharFileInfo::delMetadata — Удаляет метаданные отдельного файла в архиве
- PharFileInfo::__destruct — Уничтожает входной объект Phar
- PharFileInfo::getCRC32 — Получить контрольную сумму CRC32
- PharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::getContent — Получить полное содержимое файла записи
- PharFileInfo::getMetadata — Получить метаданные, связанные с файлом
- PharFileInfo::getPharFlags — Получить флаги файла в phar-архиве
- PharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные
- PharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC
- PharFileInfo::isCompressed — Проверить, сжат ли файл
- PharFileInfo::setMetadata — Установка метаданных для конкретного файла
PharException и другие причины отказа
PharException наследует Exception. Некоторые проверки API бросают также UnexpectedValueException/BadMethodCallException; ловить только PharException для всей сборки недостаточно. Отказ нельзя превращать в сообщение об успешной поставке; сохраняйте диагностику и оставляйте прежний результат.
Связный пример с полными файлами: показать путь от входа к результату.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Класс PharException
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)
Введение
Класс PharException предоставляет класс исключения модуля phar для блоков try/catch.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Phar::__constructPhar::__construct — Создаёт объект Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::__construct(string $filename, int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS, ?string $alias = null)Положить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
<?php
declare(strict_types=1);
$path = __DIR__ . '/receipt.phar';
$archive = new Phar($path);
$archive['receipt.txt'] = file_get_contents(__DIR__ . '/input/receipt.txt');
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Конструктор выбирает/создаёт контейнер, а присваивание в квадратных скобках добавляет содержимое. Для исполняемого формата запись разрешена только отдельному build-процессу флагом -d phar.readonly=0.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Список параметров
filename-
Путь к уже существующему Phar-архиву или к архиву, который должен быть создан. Расширение в имени файла должно содержать .phar.
flags-
Флаги, которые должны быть переданы в родительский класс RecursiveDirectoryIterator.
alias-
Псевдоним, с помощью которого должны производиться ссылки на этот Phar-архив в вызовах, связанных с функционалом потоков.
Ошибки
Выбрасывает исключение BadMethodCallException, если был вызван дважды, и исключение UnexpectedValueException, если phar-архив не может быть открыт.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::addFilePhar::addFile — Добавляет в phar-архив файл из файловой системы
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::addFile(string $filename, ?string $localName = null): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addFile(__DIR__ . '/input/receipt.txt', 'copy.txt');
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. addFile получает путь источника и отдельное внутреннее имя. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
С помощью этого метода в phar-архив может быть добавлен любой
файл или содержимое, доступное по URL. Если указан необязательный
второй параметр localName, то файл будет сохранён
в архиве с таким именем, в ином случае в качестве пути для сохранения
внутри архива будет использован параметр file.
При добавлении содержимого, доступного по URL, параметр localname
должен быть указан, иначе будет выброшено исключение.
Этот метод аналогичен ZipArchive::addFile().
Список параметров
filename-
Полный или относительный путь к файлу в файловой системе, который должен быть добавлен в phar-архив.
localName-
Путь, по которому файл будет сохранён в архиве.
Возвращаемые значения
Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
localName теперь допускает значение null.
|
Примечания
Замечание:
Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().
Смотрите также
- Phar::offsetSet() - Изменение содержимого файла
- PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
- Phar::addFromString() - Добавляет в phar-архив файл из строки
- Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::addFromStringPhar::addFromString — Добавляет в phar-архив файл из строки
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::addFromString(string $localName, string $contents): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addFromString('copy.txt', "Заказ 42: оплачен, 300 руб.\n");
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42: оплачен, 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. Строка передана как содержимое, а не как путь. Присваивание $archive["copy.txt"] = $text вызывает offsetSet через ArrayAccess. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
С помощью этого метода в phar-архив может быть добавлена любая строка.
Файл будет сохранён в архиве под именем, указанным в параметре localname.
Этот метод аналогичен ZipArchive::addFromString().
Список параметров
localName-
Путь, по которому файл будет сохранён в архиве.
contents-
Содержимое файла для сохранения.
Возвращаемые значения
Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.
Примечания
Замечание:
Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().
Смотрите также
- Phar::offsetSet() - Изменение содержимого файла
- PharData::addFromString() - Добавляет файл из строки в архив tar/zip
- Phar::addFile() - Добавляет в phar-архив файл из файловой системы
- Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::offsetSetPhar::offsetSet — Изменение содержимого файла
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::offsetSet(string $localName, resource|string $value): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->offsetSet('copy.txt', "Заказ 42: оплачен, 300 руб.\n");
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42: оплачен, 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. Строка передана как содержимое, а не как путь. Присваивание $archive["copy.txt"] = $text вызывает offsetSet через ArrayAccess. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. offsetSet используется для изменения контента существующего файла, либо для создания нового.
Список параметров
localName-
Имя файла (относительный путь).
value-
Содержимое файла.
Возвращаемые значения
Ничего не возвращает.
Ошибки
Если опция phar.readonly установлен в
1, то будет выброшено исключение
BadMethodCallException, так как модифицировать Phar-архив
можно только, если phar.readonly равен 0. Если возникнут
какие либо проблемы с записью на диск - выбрасывается исключение
PharException.
Примечания
Замечание:
Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().
Смотрите также
- Phar::offsetExists() - Определить, есть ли файл в архиве
- Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
- Phar::offsetUnset() - Удалить файл из phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::addEmptyDirPhar::addEmptyDir — Добавляет в phar-архив пустую директорию
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::addEmptyDir(string $directory): voidПодготовить место для подписанных актов. В поставку нужно включить пустой каталог acts. Добавление не создаёт acts рядом со скриптом; он находится внутри контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addEmptyDir('acts');
if (!$archive['acts']->isDir()) { throw new RuntimeException('В архиве нет каталога acts'); }
$archive->extractTo(__DIR__ . '/received', ['receipt.txt', 'notice.txt'], false);
if (!mkdir(__DIR__ . '/received/acts', 0700)) { throw new RuntimeException('Не создан каталог получателя'); }
echo "Получатель получил папку received/acts для актов\n";
echo file_get_contents(__DIR__ . '/received/receipt.txt');
Ожидаемый результат
Получатель получил папку received/acts для актов
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В PHP8.5.11 проверка обнаружила: extractTo не создал самостоятельную пустую директорию, хотя запись acts существовала. Поэтому маленький получатель явно создаёт свой известный каталог через mkdir после проверки записи, а документы извлекает по точному списку. Этот путь не превращает имена чужого архива в произвольные пути. Для пустых папок нативному Phar нужен формат API1.1.1.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
С помощью этого метода создаётся пустая директория, путь к которой указан в
dirname. Этот метод аналогичен
ZipArchive::addEmptyDir().
Список параметров
directory-
Имя пустого каталога, который должен быть создан в phar-архиве.
Возвращаемые значения
Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.
Смотрите также
- PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив
- Phar::addFile() - Добавляет в phar-архив файл из файловой системы
- Phar::addFromString() - Добавляет в phar-архив файл из строки
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::buildFromDirectoryPhar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::buildFromDirectory(string $directory, string $pattern = ""): arrayСобрать оба документа и показать соответствие имён. Вместо ручного addFile для каждого файла собираем два приложенных документа. Возвращаемый массив нужен, чтобы увидеть, какой исходник стал какой записью.
Выражение /\.txt$/ допускает только имена с окончанием .txt; рекурсивный обход выполняет метод.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$added = $archive->buildFromDirectory(__DIR__ . '/input', '/\.txt$/');
ksort($added);
foreach ($added as $inside => $disk) {
echo $inside, ' <- ', basename($disk), ":\n", $archive[$inside]->getContent();
}
Ожидаемый результат
notice.txt <- notice.txt:
Получить заказ в пункте № 3.
receipt.txt <- receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Сортировка делает порядок отчёта определённым. Исходные имена в массиве не являются новыми путями назначения. При более строгом отборе используйте явный список iterator; для SplFileInfo обязательно задайте baseDirectory.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Заполняет phar-архив содержимым директории. Необязательный второй параметр является регулярным выражением (PCRE) и используется для исключения файлов. Любой файл, чьё имя соответствует регулярному выражению, будет включён, все остальные будут исключены. Для более детализированного контроля используйте Phar::buildFromIterator().
Список параметров
directory-
Полный или абсолютный путь к директории, все файлы которой должны быть добавлены в архив.
pattern-
Необязательное регулярное выражение (PCRE), которое используется для фильтрации списка файлов. В архив будут включены только те файлы, пути к которым соответствуют регулярному выражению.
Возвращаемые значения
Phar::buildFromDirectory() возвращает ассоциативный массив, в котором отражено соответствие пути к файлу внутри архива к пути к файлу в файловой системе.
Ошибки
Этот метод выбрасывает исключение BadMethodCallException в том случае, если не удалось создать экземпляр итератора внутренних директорий. Исключение PharException выбрасывается в случае ошибок сохранения phar-архива.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 |
Phar::buildFromDirectory() больше не возвращает значение false.
|
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::buildFromIteratorPhar::buildFromIterator — Создаёт phar-архив из итератора
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): arrayСобрать оба документа и показать соответствие имён. Вместо ручного addFile для каждого файла собираем два приложенных документа. Возвращаемый массив нужен, чтобы увидеть, какой исходник стал какой записью.
ArrayIterator даёт последовательный обход массива соответствий. Ключ receipt.txt — внутреннее имя, значение — путь на диске; обычный integer-ключ здесь не подходит.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$source = new ArrayIterator(['receipt.txt' => __DIR__ . '/input/receipt.txt', 'notice.txt' => __DIR__ . '/input/notice.txt']);
$added = $archive->buildFromIterator($source);
ksort($added);
foreach ($added as $inside => $disk) {
echo $inside, ' <- ', basename($disk), ":\n", $archive[$inside]->getContent();
}
Ожидаемый результат
notice.txt <- notice.txt:
Получить заказ в пункте № 3.
receipt.txt <- receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Сортировка делает порядок отчёта определённым. Исходные имена в массиве не являются новыми путями назначения. При более строгом отборе используйте явный список iterator; для SplFileInfo обязательно задайте baseDirectory.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$iterator, ?string $baseDirectory = null): arrayЗамечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Заполняет phar-архив из итератора. Поддерживаются итераторы двух типов: такие, в которых отображается соответствие имени файла внутри phar-архива к файлу на диске, и такие как DirectoryIterator, которые возвращают объекты SplFileInfo. Для итераторов, которые возвращают объекты SplFileInfo, второй параметр является обязательным.
Список параметров
iterator-
Любой итератор, который или ассоциативно отображает пути к файлам внутри phar-архива к файлам на диске, или возвращает объекты SplFileInfo.
baseDirectory-
Для итераторов, возвращающих объекты SplFileInfo, — часть полного пути каждого файла, которая должна быть удалена во время его добавления в phar-архив.
Возвращаемые значения
Phar::buildFromIterator() возвращает ассоциативный массив, в котором отображаются соответствия пути к файлу внутри архива к пути к файлу в файловой системе.
Ошибки
Этот метод выбрасывает исключение UnexpectedValueException,
когда итератор возвращает некорректные значения, такие как целочисленный ключ
вместо строки. Исключение BadMethodCallException будет брошено,
когда итератор, основанный на SplFileInfo, используется без параметра
baseDirectory. Исключение PharException
выбрасывается в случае ошибок сохранения phar-архива.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 |
Phar::buildFromIterator() больше не возвращает значение false.
|
| 8.0.0 |
baseDirectory теперь допускает значение null.
|
Смотрите также
- Phar::buildFromDirectory() - Создаёт phar-архив из файлов, расположенных внутри директории
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::copyPhar::copy — Копирует файл внутри phar-архива в новый файл внутри phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::copy(string $from, string $to): trueСохранить второй экземпляр чека внутри пакета. Для бухгалтерии нужна запись accounting.txt с теми же байтами. Исходная receipt.txt сохраняется.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->copy('receipt.txt', 'accounting.txt');
echo "Бухгалтерия получила:\n", $archive['accounting.txt']->getContent();
try { $archive->copy('receipt.txt', 'accounting.txt'); }
catch (UnexpectedValueException $error) { echo "Повторная копия отклонена: accounting.txt уже существует\n"; }
Ожидаемый результат
Бухгалтерия получила:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Повторная копия отклонена: accounting.txt уже существует
copy не заменяет существующую запись. Вторая операция намеренно демонстрирует отказ; первая сохранённая копия остаётся.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод копирует внутренний файл phar-архива в другой новый файл внутри phar-архива. Это объектно-ориентированная альтернатива функции copy() с обёрткой потока phar.
Список параметров
from-
to-
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение UnexpectedValueException, если исходный файл не существует, целевой файл уже существует, доступ на запись запретили, если хотя бы один файл невозможно открыть или невозможно прочитать исходный файл, или выбрасывает исключение PharException, если в phar-файл невозможно записать изменения.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::deletePhar::delete — Удаляет файл в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::delete(string $localName): trueУбрать памятку, оставив чек. Получатель просит минимальную поставку. Удаляем notice.txt внутри контейнера, сохраняя её исходный файл в input.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->delete('notice.txt');
echo $archive['receipt.txt']->getContent();
echo "Исходная памятка на диске: ", file_get_contents(__DIR__ . '/input/notice.txt');
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходная памятка на диске: Получить заказ в пункте № 3.
Удаление записи не является unlink исходника. offsetUnset также вызывается через unset($archive["notice.txt"]); delete — явный метод с тем же прикладным назначением.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод удаляет файл из архива. Метод аналогичен вызову функции unlink() на обёртке потока, как показывает пример на этой странице.
Список параметров
localName-
Путь в архиве, по которому требуется удалить файл.
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение PharException, если на диск возникли ошибки во время записи изменений.
Смотрите также
- PharData::delete() - Удаляет файл в tar- или zip-архиве
- Phar::unlinkArchive() - Удаляет архив из памяти и с диска
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::offsetUnsetPhar::offsetUnset — Удалить файл из phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::offsetUnset(string $localName): voidУбрать памятку, оставив чек. Получатель просит минимальную поставку. Удаляем notice.txt внутри контейнера, сохраняя её исходный файл в input.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->offsetUnset('notice.txt');
echo $archive['receipt.txt']->getContent();
echo "Исходная памятка на диске: ", file_get_contents(__DIR__ . '/input/notice.txt');
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходная памятка на диске: Получить заказ в пункте № 3.
Удаление записи не является unlink исходника. offsetUnset также вызывается через unset($archive["notice.txt"]); delete — явный метод с тем же прикладным назначением.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. offsetUnset используется для удаления файлов и запускается каждый раз, когда используется конструкция unset().
Список параметров
localName-
Имя файла (относительный путь).
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Если опция phar.readonly установлен в
1, то будет выброшено исключение
BadMethodCallException, так как модифицировать Phar-архив
можно только, если phar.readonly равен 0. Если возникнут
какие-либо проблемы с записью на диск - выбрасывается исключение
PharException.
Смотрите также
- Phar::offsetExists() - Определить, есть ли файл в архиве
- Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
- Phar::offsetSet() - Изменение содержимого файла
- Phar::unlinkArchive() - Удаляет архив из памяти и с диска
- Phar::delete() - Удаляет файл в phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::__destructPhar::__destruct — Уничтожает объект архива Phar
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::__destruct()Завершить работу объекта и вновь прочитать сохранённый чек. Деструктор вызывается при уничтожении объекта. В обычной программе освобождаем ссылку через unset, а не вызываем магический метод вручную.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
unset($archive);
$archive = new Phar($path);
echo "Повторное открытие: ", $archive['receipt.txt']->getContent();
Ожидаемый результат
Повторное открытие: Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
unset убирает переменную объекта; другие ссылки и внутренний кеш Phar могут продолжить существовать. Это не транзакционный rollback и не удаление контейнера. Повторный объект читает сохранённые данные.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Список параметров
Сигнатура функции не содержит параметров.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::extractToPhar::extractTo — Извлечь содержимое phar-архива в директорию
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): boolПолучить только чек, сохранив существующий результат. Нужен реальный received/receipt.txt, без памятки и без перезаписи. Передаём массив точных собственных имён и overwrite=false.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->extractTo(__DIR__ . '/received', ['receipt.txt'], false);
echo file_get_contents(__DIR__ . '/received/receipt.txt');
try { $archive->extractTo(__DIR__ . '/received', ['receipt.txt'], false); }
catch (PharException $error) { echo "Повторное извлечение отклонено; прежний чек сохранён\n"; }
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Повторное извлечение отклонено; прежний чек сохранён
В отличие от ZipArchive, Phar сохраняет разрешения извлекаемых записей. Здесь архив собственный и маленький; для внешнего архива нужны лимиты и проверка типов/имён до записи. extractTo не предоставляет транзакцию.
Перед чтением контракта. Уточнение из актуальной английской документации: извлечение следует уже существующим символическим ссылкам в папке назначения. Ссылка на каталог способна вывести запись за выбранную папку; отсутствующий файл по ссылке будет создан; существующий файл по ссылке перезаписывается при overwrite=true. Наш импорт создаёт отдельную новую папку, использует известные имена и не работает в общем каталоге, где другой процесс может подменять пути.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$directory, array|string|null $files = null, bool $overwrite = false): bool
Извлекает все файлы phar-архива на диск. Извлечённые файлы и директории сохраняют
все разрешения, которые у них были. Опциональные параметры позволяют контролировать,
какие именно файлы извлекать и нужно ли перезаписывать уже существующие.
Второй параметр files может быть как именем файла, так и
путём директории, которые надо извлекать. По умолчанию уже существующие на диске
файлы перезаписываться не будут. Для указания, что нужно использовать перезапись,
используется третий параметр.
Этот метод аналогичен методу ZipArchive::extractTo().
Список параметров
Возвращаемые значения
Возвращает true в случае успешного выполнения. Но лучше использовать механизм перехвата исключений для контроля успешности.
Ошибки
Выбрасывает исключение PharException в случае возникновения ошибки записи на диск.
Примечания
Замечание:
Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов —
<|>*?":. Имена файлов с точкой в конце также не поддерживаются. В отличие от ряда инструментов извлечения, метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::isWritablePhar::isWritable — Проверяет, можно ли модифицировать phar-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::isWritable(): boolДобавить исправление только доступному для записи контейнеру. Уже открытый архив может быть доступен для чтения, но запись зависит от прав и настроек. Проверка выбирает действие, а исключение всё равно обрабатывает отказ самой записи.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if (!$archive->isWritable()) { throw new RuntimeException('Эту поставку можно только читать'); }
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Проверка возможности не блокирует состояние файловой системы между проверкой и записью. Phar::canWrite проверяет настройку расширения в целом; isWritable относится к конкретному объекту.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот метод возвращает true, если phar.readonly установлен в
0, архив существует и доступен для записи.
Список параметров
Параметров нет.
Возвращаемые значения
Возвращает true, если архив можно модифицировать
Смотрите также
- Phar::canWrite() - Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
- PharData::isWritable() - Проверить, можно ли модифицировать tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::__constructPharData::__construct — Конструктор объекта PharData
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::__construct( string $filename, int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS, ?string $alias = null, int $format = 0)Положить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
<?php
declare(strict_types=1);
$path = __DIR__ . '/receipt.tar';
$archive = new PharData($path);
$archive['receipt.txt'] = file_get_contents(__DIR__ . '/input/receipt.txt');
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Конструктор выбирает/создаёт контейнер, а присваивание в квадратных скобках добавляет содержимое. PharData работает с данными TAR/ZIP; ему не нужно отключать phar.readonly для обычной записи данных.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Список параметров
filename-
Путь либо к существующему tar/zip-архиву, либо к вновь создаваемому
flags-
Флаги для передачи родительскому классу Phar RecursiveDirectoryIterator.
alias-
Псевдоним, который необходимо назначить phar-архиву для использования в потоковых обёртках.
format-
Одна из констант формата файлов доступная для класса Phar.
Ошибки
Выбрасывает исключение BadMethodCallException, если вызван дважды; Выбрасывает исключение UnexpectedValueException, если Phar-архив невозможно открыть.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::addFilePharData::addFile — Добавить существующие файлы к tar/zip-архиву
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::addFile(string $filename, ?string $localName = null): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addFile(__DIR__ . '/input/receipt.txt', 'copy.txt');
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. addFile получает путь источника и отдельное внутреннее имя. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
С помощью этого метода можно добавить к архиву любые файлы или URL.
Если задан опциональный параметр localname,
то файл будет добавлен в архив с указанным именем, иначе
будет использовано оригинальное имя из параметра file.
Для URL локальное имя должно быть указано в обязательном порядке,
иначе будет выброшено исключение.
Метод аналогичен ZipArchive::addFile().
Список параметров
filename-
Полный или относительный путь до файла на диске.
localName-
Путь, по которому файл необходимо добавить в архив.
Возвращаемые значения
Ничего не возвращает, а в случае возникновения ошибки выбрасывает исключение.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
localName теперь допускает значение null.
|
Примечания
Замечание:
PharData::addFile(), PharData::addFromString() и PharData::offsetSet() сохраняют контейнер при каждом вызове. Для большого набора файлов лучше использовать PharData::buildFromDirectory() или PharData::buildFromIterator() для пакетной сборки.
Смотрите также
- PharData::offsetSet() - Изменение содержимого файла
- Phar::addFile() - Добавляет в phar-архив файл из файловой системы
- PharData::addFromString() - Добавляет файл из строки в архив tar/zip
- PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::addFromStringPharData::addFromString — Добавляет файл из строки в архив tar/zip
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::addFromString(string $localName, string $contents): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addFromString('copy.txt', "Заказ 42: оплачен, 300 руб.\n");
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42: оплачен, 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. Строка передана как содержимое, а не как путь. Присваивание $archive["copy.txt"] = $text вызывает offsetSet через ArrayAccess. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот метод позволяет создать внутри архива файл с заданным текстом.
Файл будет сохранён по пути localname. Этот метод
аналогичен ZipArchive::addFromString().
Список параметров
localName-
Путь создаваемого файла.
contents-
Содержимое файла в виде строки
Возвращаемые значения
Ничего не возвращает, в случае возникновения ошибки выбрасывает исключение.
Примечания
Замечание:
PharData::addFile(), PharData::addFromString() и PharData::offsetSet() сохраняют контейнер при каждом вызове. Для большого набора файлов лучше использовать PharData::buildFromDirectory() или PharData::buildFromIterator() для пакетной сборки.
Смотрите также
- PharData::offsetSet() - Изменение содержимого файла
- Phar::addFromString() - Добавляет в phar-архив файл из строки
- PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
- PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::offsetSetPharData::offsetSet — Изменение содержимого файла
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::offsetSet(string $localName, resource|string $value): voidПоложить чек в контейнер и прочитать текст. Получатель должен получить конкретный чек. Начинаем с одного документа, его имени и строки, которую можно прочитать обычным PHP-кодом.
$archive["имя"] выбирает запись и возвращает PharFileInfo; ->getContent() читает её байты. Конструктор new создаёт объект, а не извлечённую папку.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->offsetSet('copy.txt', "Заказ 42: оплачен, 300 руб.\n");
echo $archive['copy.txt']->getContent();
Ожидаемый результат
Заказ 42: оплачен, 300 руб.
copy.txt — имя внутри контейнера, исходный input/receipt.txt не удаляется. Строка передана как содержимое, а не как путь. Присваивание $archive["copy.txt"] = $text вызывает offsetSet через ArrayAccess. При отказе метод бросает исключение: void не надо проверять как false.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым tar/zip-архива в стиле доступа к элементам массива. offsetSet используется для изменения контента существующего файла, либо для создания нового.
Список параметров
localName-
Имя файла (относительный путь).
value-
Содержимое файла.
Возвращаемые значения
Ничего не возвращает.
Ошибки
Выбрасывает исключение PharException в случае проблем с записью на диск.
Примечания
Замечание:
PharData::addFile(), PharData::addFromString() и PharData::offsetSet() сохраняют контейнер при каждом вызове. Для большого набора файлов лучше использовать PharData::buildFromDirectory() или PharData::buildFromIterator() для пакетной сборки.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::addEmptyDirPharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::addEmptyDir(string $directory): voidПодготовить место для подписанных актов. В поставку нужно включить пустой каталог acts. Добавление не создаёт acts рядом со скриптом; он находится внутри контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->addEmptyDir('acts');
if (!$archive['acts']->isDir()) { throw new RuntimeException('В архиве нет каталога acts'); }
$archive->extractTo(__DIR__ . '/received', ['receipt.txt', 'notice.txt'], false);
if (!mkdir(__DIR__ . '/received/acts', 0700)) { throw new RuntimeException('Не создан каталог получателя'); }
echo "Получатель получил папку received/acts для актов\n";
echo file_get_contents(__DIR__ . '/received/receipt.txt');
Ожидаемый результат
Получатель получил папку received/acts для актов
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В PHP8.5.11 проверка обнаружила: extractTo не создал самостоятельную пустую директорию, хотя запись acts существовала. Поэтому маленький получатель явно создаёт свой известный каталог через mkdir после проверки записи, а документы извлекает по точному списку. Этот путь не превращает имена чужого архива в произвольные пути. Для пустых папок нативному Phar нужен формат API1.1.1.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
С помощью этого места можно создать директорию по пути dirname.
Этот метод аналогичен ZipArchive::addEmptyDir().
Список параметров
directory-
Путь создаваемой директории
Возвращаемые значения
Ничего не возвращает. В случае ошибок выбрасывает исключение.
Смотрите также
- Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию
- PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
- PharData::addFromString() - Добавляет файл из строки в архив tar/zip
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::buildFromDirectoryPharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::buildFromDirectory(string $directory, string $pattern = ""): arrayСобрать оба документа и показать соответствие имён. Вместо ручного addFile для каждого файла собираем два приложенных документа. Возвращаемый массив нужен, чтобы увидеть, какой исходник стал какой записью.
Выражение /\.txt$/ допускает только имена с окончанием .txt; рекурсивный обход выполняет метод.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$added = $archive->buildFromDirectory(__DIR__ . '/input', '/\.txt$/');
ksort($added);
foreach ($added as $inside => $disk) {
echo $inside, ' <- ', basename($disk), ":\n", $archive[$inside]->getContent();
}
Ожидаемый результат
notice.txt <- notice.txt:
Получить заказ в пункте № 3.
receipt.txt <- receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Сортировка делает порядок отчёта определённым. Исходные имена в массиве не являются новыми путями назначения. При более строгом отборе используйте явный список iterator; для SplFileInfo обязательно задайте baseDirectory.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Наполняет tar/zip-архив содержимым директории. Второй опциональный параметр является регулярным выражением (pcre). Файлы, имена которых подходят под регулярное выражение, будут включены в архив, а все остальные нет. Если при создании архива нужна большая избирательность, то используйте метод PharData::buildFromIterator().
Список параметров
directory-
Полный или относительный путь до директории, файлы из которой будут добавлены в архив.
pattern-
Регулярное выражение, определяющее, какие файлы необходимо включать в архив.
Возвращаемые значения
Phar::buildFromDirectory() возвращает ассоциативный массив,
связывающий путь к файлу внутри архива с полным путём к файлу на диске или false, если возникла ошибка.
Ошибки
Выбрасывает исключение BadMethodCallException, если не удаётся инициализировать внутренние итераторы директории. Исключение PharException выбрасывается при ошибках записи на диск.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 |
PharData::buildFromDirectory() больше не возвращает значение false.
|
Смотрите также
- Phar::buildFromDirectory() - Создаёт phar-архив из файлов, расположенных внутри директории
- PharData::buildFromIterator() - Создание tar/zip-архива с помощью итератора
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::buildFromIteratorPharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): arrayСобрать оба документа и показать соответствие имён. Вместо ручного addFile для каждого файла собираем два приложенных документа. Возвращаемый массив нужен, чтобы увидеть, какой исходник стал какой записью.
ArrayIterator даёт последовательный обход массива соответствий. Ключ receipt.txt — внутреннее имя, значение — путь на диске; обычный integer-ключ здесь не подходит.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$source = new ArrayIterator(['receipt.txt' => __DIR__ . '/input/receipt.txt', 'notice.txt' => __DIR__ . '/input/notice.txt']);
$added = $archive->buildFromIterator($source);
ksort($added);
foreach ($added as $inside => $disk) {
echo $inside, ' <- ', basename($disk), ":\n", $archive[$inside]->getContent();
}
Ожидаемый результат
notice.txt <- notice.txt:
Получить заказ в пункте № 3.
receipt.txt <- receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Сортировка делает порядок отчёта определённым. Исходные имена в массиве не являются новыми путями назначения. При более строгом отборе используйте явный список iterator; для SplFileInfo обязательно задайте baseDirectory.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$iterator, ?string $baseDirectory = null): arrayНаполнение архив tar или zip с помощью итератора. Поддерживаются два типа итераторов: итератор, связывающий файл на диске с файлом внутри архива и итератор в стиле DirectoryIterator, который возвращает объекты SplFileInfo. Для итераторов, возвращающих объекты SplFileInfo, второй параметр является обязательным.
Список параметров
iterator-
Итератор, предоставляющий связки ключ=>значение, либо объекты SplFileInfo
baseDirectory-
Для итераторов, возвращающих объекты SplFileInfo, часть полного пути добавляемых файлов, которая будет удаляться из полного пути внутри архива.
Возвращаемые значения
PharData::buildFromIterator() возвращает ассоциативный массив, связывающий путь к файлу внутри архива с полным путём к файлу на диске.
Ошибки
Метод выбрасывает исключение UnexpectedValueException, если
итератор вернул некорректное значение, например целочисленный ключ вместо строки.
Исключение BadMethodCallException выбрасывается когда
задан итератор, возвращающий объекты SplFileInfo без задания параметра
baseDirectory. В случае проблем с записью на диск бросается
исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 |
PharData::buildFromIterator() больше не возвращает значение false.
|
| 8.0.0 |
baseDirectory теперь допускает значение null.
|
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::copyPharData::copy — Копирует файл внутри tar- или zip-архива в новый файл внутри того же архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::copy(string $from, string $to): trueСохранить второй экземпляр чека внутри пакета. Для бухгалтерии нужна запись accounting.txt с теми же байтами. Исходная receipt.txt сохраняется.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->copy('receipt.txt', 'accounting.txt');
echo "Бухгалтерия получила:\n", $archive['accounting.txt']->getContent();
try { $archive->copy('receipt.txt', 'accounting.txt'); }
catch (UnexpectedValueException $error) { echo "Повторная копия отклонена: accounting.txt уже существует\n"; }
Ожидаемый результат
Бухгалтерия получила:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Повторная копия отклонена: accounting.txt уже существует
copy не заменяет существующую запись. Вторая операция намеренно демонстрирует отказ; первая сохранённая копия остаётся.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод копирует файл из tar- или zip-архива в новый файл внутри того же архива. Это объектно-ориентированная альтернатива функции copy() с обёрткой потока phar.
Список параметров
from-
to-
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение UnexpectedValueException, если исходный файл не существует, целевой файл уже существует, доступ на запись запретили, если хотя бы один файл невозможно открыть или невозможно прочитать исходный файл, или выбрасывает исключение PharException, если в phar-файл невозможно записать изменения.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::deletePharData::delete — Удаляет файл в tar- или zip-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::delete(string $localName): trueУбрать памятку, оставив чек. Получатель просит минимальную поставку. Удаляем notice.txt внутри контейнера, сохраняя её исходный файл в input.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->delete('notice.txt');
echo $archive['receipt.txt']->getContent();
echo "Исходная памятка на диске: ", file_get_contents(__DIR__ . '/input/notice.txt');
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходная памятка на диске: Получить заказ в пункте № 3.
Удаление записи не является unlink исходника. offsetUnset также вызывается через unset($archive["notice.txt"]); delete — явный метод с тем же прикладным назначением.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод удаляет файл в архиве. Функционально метод эквивалентен вызову функции unlink() на обёртке эквивалентного потока, как показывает пример на этой странице.
Список параметров
localName-
Путь в архиве, по которому требуется удалить файл.
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение PharException, если возникла ошибка при сохранении изменений на диск.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::offsetUnsetPharData::offsetUnset — Удалить файл из tar/zip-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::offsetUnset(string $localName): voidУбрать памятку, оставив чек. Получатель просит минимальную поставку. Удаляем notice.txt внутри контейнера, сохраняя её исходный файл в input.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->offsetUnset('notice.txt');
echo $archive['receipt.txt']->getContent();
echo "Исходная памятка на диске: ", file_get_contents(__DIR__ . '/input/notice.txt');
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходная памятка на диске: Получить заказ в пункте № 3.
Удаление записи не является unlink исходника. offsetUnset также вызывается через unset($archive["notice.txt"]); delete — явный метод с тем же прикладным назначением.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым tar/zip-архива в стиле доступа к элементам массива. offsetUnset используется для удаления файлов и запускается каждый раз, когда используется конструкция unset().
Список параметров
localName-
Имя файла (относительный путь).
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбрасывает исключение PharException в случае проблем с записью на диск.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::__destructPharData::__destruct — Уничтожает неисполняемый объект архива tar или zip
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::__destruct()Завершить работу объекта и вновь прочитать сохранённый чек. Деструктор вызывается при уничтожении объекта. В обычной программе освобождаем ссылку через unset, а не вызываем магический метод вручную.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
unset($archive);
$archive = new PharData($path);
echo "Повторное открытие: ", $archive['receipt.txt']->getContent();
Ожидаемый результат
Повторное открытие: Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
unset убирает переменную объекта; другие ссылки и внутренний кеш Phar могут продолжить существовать. Это не транзакционный rollback и не удаление контейнера. Повторный объект читает сохранённые данные.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Список параметров
Сигнатура функции не содержит параметров.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::extractToPharData::extractTo — Извлечь содержимое tar/zip-архива в директорию
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): boolПолучить только чек, сохранив существующий результат. Нужен реальный received/receipt.txt, без памятки и без перезаписи. Передаём массив точных собственных имён и overwrite=false.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->extractTo(__DIR__ . '/received', ['receipt.txt'], false);
echo file_get_contents(__DIR__ . '/received/receipt.txt');
try { $archive->extractTo(__DIR__ . '/received', ['receipt.txt'], false); }
catch (PharException $error) { echo "Повторное извлечение отклонено; прежний чек сохранён\n"; }
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Повторное извлечение отклонено; прежний чек сохранён
В отличие от ZipArchive, Phar сохраняет разрешения извлекаемых записей. Здесь архив собственный и маленький; для внешнего архива нужны лимиты и проверка типов/имён до записи. extractTo не предоставляет транзакцию.
Перед чтением контракта. Уточнение из актуальной английской документации: извлечение следует уже существующим символическим ссылкам в папке назначения. Ссылка на каталог способна вывести запись за выбранную папку; отсутствующий файл по ссылке будет создан; существующий файл по ссылке перезаписывается при overwrite=true. Наш импорт создаёт отдельную новую папку, использует известные имена и не работает в общем каталоге, где другой процесс может подменять пути.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$directory, array|string|null $files = null, bool $overwrite = false): bool
Извлекает все файлы tar/zip-архива на диск. Извлечённые файлы и директории сохраняют
все разрешения, которые у них были. Опциональные параметры позволяют контролировать,
какие именно файлы извлекать и нужно ли перезаписывать уже существующие.
Второй параметр files может быть как именем файла, так и
путём директории, которые надо извлекать. По умолчанию уже существующие на диске
файлы перезаписываться не будут. Для указания, что нужно использовать перезапись,
используется третий параметр.
Этот метод аналогичен методу ZipArchive::extractTo().
Список параметров
directory-
Путь, по которому необходимо сохраните извлечённые файлы (
files) files-
Имя файла или директории, которые надо извлечь. Либо архив с именами файлов/директорий
overwrite-
Установите в
true, если необходимо перезаписывать уже существующие файлы
Возвращаемые значения
Возвращает true в случае успешного выполнения. Но лучше использовать механизм перехвата исключений для контроля успешности.
Ошибки
Выбрасывает исключение PharException в случае возникновения ошибки записи на диск.
Примечания
Замечание:
Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов —
<|>*?":. Имена файлов с точкой в конце также не поддерживаются. В отличие от ряда инструментов извлечения, метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::isWritablePharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::isWritable(): boolДобавить исправление только доступному для записи контейнеру. Уже открытый архив может быть доступен для чтения, но запись зависит от прав и настроек. Проверка выбирает действие, а исключение всё равно обрабатывает отказ самой записи.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if (!$archive->isWritable()) { throw new RuntimeException('Эту поставку можно только читать'); }
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Проверка возможности не блокирует состояние файловой системы между проверкой и записью. Для обычного PharData phar.readonly не запрещает изменение TAR/ZIP, но права ОС остаются обязательными.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот метод возвращает true, если tar/zip-архив существует и доступен для записи.
В отличие от Phar::isWritable(), tar/zip-архивы с данными
можно менять даже если phar.readonly установлен в 1.
Список параметров
Параметры отсутствуют.
Смотрите также
- Phar::canWrite() - Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
- Phar::isWritable() - Проверяет, можно ли модифицировать phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::offsetGetPhar::offsetGet — Получить объект PharFileInfo для конкретного файла
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::offsetGet(string $localName): SplFileInfoНайти и показать документ получателю. Выбранный PharFileInfo даёт доступ к содержимому и свойствам конкретной записи.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive->offsetGet('receipt.txt');
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Квадратные скобки используют ArrayAccess: isset соответствует offsetExists, чтение соответствует offsetGet. count($archive) обращается к Countable. Имена относятся к текущему контейнеру, а не к внешней папке.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. Phar::offsetGet() используется для извлечения файлов из архива.
Список параметров
localName-
Имя файла (относительный путь).
Возвращаемые значения
Объект класса PharFileInfo. Можно использовать для получения информации о файле и для извлечения контента через итерирование.
Ошибки
Выбрасывает исключение BadMethodCallException, если такого файла нет.
Смотрите также
- Phar::offsetExists() - Определить, есть ли файл в архиве
- Phar::offsetSet() - Изменение содержимого файла
- Phar::offsetUnset() - Удалить файл из phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::offsetExistsPhar::offsetExists — Определить, есть ли файл в архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::offsetExists(string $localName): boolНайти и показать документ получателю. Наличие чека определяет, можно ли показать его человеку; отсутствие дополнительного счёта даёт отдельное сообщение.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if ($archive->offsetExists('receipt.txt')) { echo $archive['receipt.txt']->getContent(); }
if (!$archive->offsetExists('invoice.txt')) { echo "Счёт invoice.txt не приложен\n"; }
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Счёт invoice.txt не приложен
Квадратные скобки используют ArrayAccess: isset соответствует offsetExists, чтение соответствует offsetGet. count($archive) обращается к Countable. Имена относятся к текущему контейнеру, а не к внешней папке.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива.
offsetExists() запускается каждый раз, когда вызывается isset().
Список параметров
localName-
Имя файла (относительный путь).
Смотрите также
- Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
- Phar::offsetSet() - Изменение содержимого файла
- Phar::offsetUnset() - Удалить файл из phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::countPhar::count — Возвращает количество записей (файлов) в Phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::count(int $mode = COUNT_NORMAL): intНайти и показать документ получателю. Число используется как заголовок содержимого поставки, затем читатель видит сами документы. COUNT_RECURSIVE включает скрытые/удалённые внутренние элементы и не означает обычный рекурсивный файловый обход.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
echo 'Поставка содержит ', $archive->count(), " документа:\n";
foreach (['receipt.txt', 'notice.txt'] as $name) { echo $name, ":\n", $archive[$name]->getContent(); }
Ожидаемый результат
Поставка содержит 2 документа:
receipt.txt:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
notice.txt:
Получить заказ в пункте № 3.
Квадратные скобки используют ArrayAccess: isset соответствует offsetExists, чтение соответствует offsetGet. count($archive) обращается к Countable. Имена относятся к текущему контейнеру, а не к внешней папке.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Список параметров
mode-
Параметр
mode- целочисленное значение, определяющее используемый режим подсчёта. По умолчанию установлено значениеCOUNT_NORMAL, подсчитываются только элементы в архиве, которые не были удалены или скрыты. Если установлено значениеCOUNT_RECURSIVE, подсчитываются все элементы в архиве, включая удалённые или скрытые.
Возвращаемые значения
Количество файлов, содержащихся в этом phar-архиве, либо 0
(число ноль), если архив пуст.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::compressPhar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::compress(int $compression, ?string $extension = null): ?PharПередать сжатый контейнер и вернуть читаемый чек. Весь phar-контейнер обёрнут gzip. Метод возвращает новый объект; исходный $archive продолжает обозначать исходный архив, поэтому результат сохраняем в отдельную переменную.
Phar::GZ выбирает gzip; $packed хранит объект нового файла. Выбор Phar::BZ2 требует bz2. Не проверяйте возвращаемый объект через === true.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$packed = $archive->compress(Phar::GZ);
if ($packed === null) { throw new RuntimeException('Нет сжатого архива'); }
echo 'Создан ', basename($packed->getPath()), ":\n", $packed['receipt.txt']->getContent();
Ожидаемый результат
Создан orders.phar.gz:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
На диске остаются оба контейнера. Для ZIP сжатие целого файла через этот метод не поддерживается; используйте compressFiles для записей. decompression создаёт новое имя, чтобы не перезаписать исходный orders.phar. Восстановление контейнера ещё не извлечение его документов.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
В случае использования с phar-архивами, основанными на tar или phar, этот метод сжимает весь архив, используя gzip- или bzip2-сжатие. Полученный файл может быть обработан одной из команд gunzip/bunzip; к нему также можно получить прямой доступ, используя модуль Phar.
В случае использования с phar-архивами, основанными на zip, вызов этого метода потерпит неудачу и будет брошено исключение. Для сжатия по алгоритму gzip должен быть включён модуль zlib. Для сжатия по алгоритму bzip2 должен быть включён модуль bzip2. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.
Кроме того, этот метод автоматически переименовывает архив, добавляя .gz,
.bz2 или удаляя расширение, если в качестве первого параметра был передан
Phar::NONE, сообщающий о необходимости распаковки. В качестве альтернативы
расширение файла может быть задано с помощью второго параметра.
Список параметров
compression-
Сжатие должно быть определено одной из констант:
Phar::GZ,Phar::BZ2для использования соответствующего алгоритма сжатия, илиPhar::NONEдля распаковки. extension-
Для сжатия phar-архивов по умолчанию используется расширение
.phar.gzили.phar.bz2, а для сжатия tar-архивов —.phar.tar.gzили.phar.tar.bz2. В случае распаковки, расширениями по умолчанию являются.pharи.phar.tar.
Ошибки
Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или модуль bzip2 не включён.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
extension теперь допускает значение null.
|
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::decompressPhar::decompress — Распаковывает весь Phar-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::decompress(?string $extension = null): ?PharПередать сжатый контейнер и вернуть читаемый чек. Весь phar-контейнер обёрнут gzip. Метод возвращает новый объект; исходный $archive продолжает обозначать исходный архив, поэтому результат сохраняем в отдельную переменную.
Phar::GZ выбирает gzip; $packed хранит объект нового файла. Выбор Phar::BZ2 требует bz2. Не проверяйте возвращаемый объект через === true.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$packed = $archive->compress(Phar::GZ);
if ($packed === null) { throw new RuntimeException('Нет сжатого архива'); }
$restored = $packed->decompress('restored.phar');
if ($restored === null) { throw new RuntimeException('Нет распакованного архива'); }
echo 'Создан ', basename($restored->getPath()), ":\n", $restored['receipt.txt']->getContent();
Ожидаемый результат
Создан orders.restored.phar:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
На диске остаются оба контейнера. Для ZIP сжатие целого файла через этот метод не поддерживается; используйте compressFiles для записей. decompression создаёт новое имя, чтобы не перезаписать исходный orders.phar. Восстановление контейнера ещё не извлечение его документов.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
В случае с phar-архивами, основанными на tar или phar, этот метод распаковывает весь архив.
В случае с phar-архивами, основанными на zip, вызов данного метода потерпит неудачу и будет брошено исключение. Для распаковки архива, сжатого по алгоритму gzip, должен быть включён модуль zlib; для распаковки архива, сжатого по алгоритму bzip2, должен быть включён модуль bzip2. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.
Кроме того, этот метод автоматически меняет расширения файла архива: по умолчанию
.phar для phar-архивов и .phar.tar для phar-архивов,
основанных на tar. В качестве альтернативы расширение файла может быть задано
с помощью второго параметра.
Список параметров
extension-
Расширениями распакованного файла по умолчанию являются
.pharи.phar.tar. Этот параметр может быть использован для задания другого расширения распакованного файла. Имейте в виду, что все исполняемые phar-архивы должны содержать.pharв имени файла.
Возвращаемые значения
Возвращает объект Phar в случае успешного выполнения и null в случае возникновения ошибки.
Ошибки
Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или модуль bzip2 не включён.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
extension теперь допускает значение null.
|
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::compressFilesPhar::compressFiles — Сжимает все файлы в текущем Phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::compressFiles(int $compression): voidСменить хранение записей, сохранив оба документа. Сжатие применяется к записям текущего контейнера. Цель — прежние имена и точные тексты. Вручную gzdecode над getContent не нужен.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->compressFiles(Phar::GZ);
echo "Чек после изменения хранения:\n", $archive['receipt.txt']->getContent();
echo "Памятка после изменения хранения:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Чек после изменения хранения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Памятка после изменения хранения:
Получить заказ в пункте № 3.
Текущий нативный Phar поддерживает отдельное сжатие. TAR этой возможности не имеет: его сжимают целиком. Для изменения уже сжатых записей нужен и декодер старого алгоритма, и кодер нового.
Перед чтением контракта. Версионное уточнение для PHP 8.5.11: compressFiles принимает Phar::GZ или Phar::BZ2. Упоминание Phar::NONE как способа распаковки в старом тексте ниже не соответствует проверке аргумента в этой реализации. Для снятия сжатия используйте отдельный decompressFiles или PharFileInfo::decompress; оба пути и проверка восстановленного текста разобраны выше.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
В случае использования с phar-архивами, основанными на tar, этот метод выбрасывает исключение BadMethodCallException, поскольку сжатие отдельных файлов внутри tar-архива не поддерживается данным форматом. Для сжатия целого phar-архива, основанного на tar, используйте Phar::compress().
В случае использования с phar-архивами, основанными на zip или phar, этот метод сжимает все файлы в Phar-архиве используя указанный алгоритм сжатия. Для возможности воспользоваться данным методом должен быть включён модуль zlib или bzip2. Кроме того, если какие-либо файлы в архиве уже сжаты с использованием bzip2/zlib-сжатия, то для их распаковки перед повторным сжатием должен быть включён соответствующий модуль. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.
Список параметров
compression-
Сжатие должно быть определено одной из констант:
Phar::GZ,Phar::BZ2для использования соответствующего алгоритма сжатия, илиPhar::NONEдля распаковки.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или если какие-либо файлы внутри архива были сжаты при помощи bzip2-сжатия и модуль bzip2 не включён.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::decompressFilesPhar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::decompressFiles(): trueСменить хранение записей, сохранив оба документа. Сжатие применяется к записям текущего контейнера. Цель — прежние имена и точные тексты. Для групповой распаковки сначала проверяем результат и показываем обход обнаруженного ограничения нашей сборки.
copy сохраняет отдельный учебный вход. $complete собирает результат двух сравнений; при расхождении читаем заново неизменённый источник, а PharFileInfo::decompress распаковывает каждую запись отдельно. Это проверка маленьких собственных файлов, а не универсальный способ исправить повреждённый чужой архив.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->compressFiles(Phar::GZ);
$saved = __DIR__ . '/packed-copy.phar';
if (!copy($path, $saved)) { throw new RuntimeException('Не сохранён вход получателя'); }
$archive = new Phar($saved);
$archive->decompressFiles();
$complete = true;
foreach (['receipt.txt', 'notice.txt'] as $name) {
if ($archive[$name]->getContent() !== file_get_contents(__DIR__ . '/input/' . $name)) { $complete = false; }
}
if (!$complete) {
echo "Групповая распаковка не прошла проверку; используем пофайловую из сохранённого входа\n";
$fallback = __DIR__ . '/per-entry.phar';
if (!copy($path, $fallback)) { throw new RuntimeException('Нет резервного входа'); }
$archive = new Phar($fallback);
foreach (['receipt.txt', 'notice.txt'] as $name) { $archive[$name]->decompress(); }
}
foreach (['receipt.txt', 'notice.txt'] as $name) {
if ($archive[$name]->getContent() !== file_get_contents(__DIR__ . '/input/' . $name)) { throw new RuntimeException('Нельзя выдавать неполный документ'); }
}
echo "Чек после изменения хранения:\n", $archive['receipt.txt']->getContent();
echo "Памятка после изменения хранения:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Групповая распаковка не прошла проверку; используем пофайловую из сохранённого входа
Чек после изменения хранения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Памятка после изменения хранения:
Получить заказ в пункте № 3.
Текущий нативный Phar поддерживает отдельное сжатие. TAR этой возможности не имеет: его сжимают целиком. Для изменения уже сжатых записей нужен и декодер старого алгоритма, и кодер нового. В проверенной PHP8.5.11 успешный return bulk-метода не обеспечил точное восстановление текста. Пример обнаруживает расхождение до вывода, использует неизменённый сжатый источник и рабочий PharFileInfo::decompress для каждой записи. Ожидаемый вывод фиксирует именно это наблюдение, а не обещает такой дефект у всех версий. Эталон здесь известен из собственных input-файлов; для внешнего обмена его получают доверенным способом.
Перед чтением контракта. Уточнение реализации PHP 8.5.11: для TAR этот метод завершает вызов без изменения записей; старое описание исключения не отражает этот путь. TAR сжимают и распаковывают целиком. Для PHAR/ZIP наш пример дополнительно сравнивает реальные восстановленные байты и показывает рабочий пофайловый путь, если групповая операция не дала исходный текст.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
При работе с phar-архивами на основе формата tar метод выбрасывает исключение BadMethodCallException, поскольку сжатие отдельных файлов внутри tar-архива не поддерживается форматом файла. Для сжатия целого phar-архива на основе формата tar пользуются методом Phar::compress().
При работе с phar-архивами на основе форматов zip или phar метод распаковывает все файлы в Phar-архиве. Для распаковки файлов этим методом потребуется включить модуль zlib или bzip2, если файлы внутри архива сжали методом bzip2 или zlib. Как и в случае с другим функционалом, который модифицирует содержание phar-архива, для успешной работы метода потребуется отключить INI-переменную phar.readonly.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib недоступен или если файлы внутри архива сжали методом bzip2, а модуль bzip2 отключён.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::convertToDataPhar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharDataСменить формат поставки, сохранив исходник. Нужен неисполняемый TAR для обмена данными: загрузчик и псевдоним удаляются из нового контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$converted = $archive->convertToData(Phar::TAR, Phar::NONE);
if ($converted === null) { throw new RuntimeException('Конвертация не выполнена'); }
echo "Новый контейнер содержит:\n", $converted['receipt.txt']->getContent();
echo "Исходный контейнер по-прежнему содержит:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Новый контейнер содержит:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходный контейнер по-прежнему содержит:
Получить заказ в пункте № 3.
Метод создаёт новый файл и возвращает соответствующий объект, а не переименовывает исходный объект на месте. Незавершённая буферизация, неизвестный формат/кодек, несовместимое расширение или занятое целевое имя вызывают отказ. PharData не принимает нативный формат PHAR для convertToData.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$format = null, ?int $compression = null, ?string $extension = null): ?PharDataЭтот метод используется для конвертирования phar-архив в tar- или zip-файл. Чтобы создать сделать tar или zip неисполняемым, из создаваемого в результате конвертации архива удаляются загрузка и псевдоним phar-архива.
Если не были указаны никакие изменения, то данный метод выбросит исключение BadMethodCallException, если форматом файла архива является phar. В случае использования с архивами в формате tar или zip, данный метод конвертирует архив в неисполняемый архив.
В случае успешного выполнения данный метод создаёт на диске новый архив и возвращает объект PharData. Старый архив не удаляется с диска, это должно быть сделано вручную после завершения процесса.
Список параметров
format-
Значением этого параметра должна быть одна из констант:
Phar::TARилиPhar::ZIP. Если значение установлено вnull, то существующий формат файла будет сохранён. compression-
Значением этого параметра должна быть одна из констант:
Phar::NONEдля отсутствия сжатия всего архива,Phar::GZдля сжатия, основанного на zlib, илиPhar::BZ2для bzip-сжатия. extension-
Этот параметр используется для переопределения расширение файла по умолчанию для сконвертированного архива. Обратите внимание, что
.pharне может быть использовано где-либо в имени файла неисполняемого tar- или zip-архива.В случае конвертации phar-архива, основанного на tar, расширениями по умолчанию являются:
.tar,.tar.gzи.tar.bz2, в зависимости от указанного сжатия. Для архивов, основанных на zip, расширением по умолчанию является.zip.
Возвращаемые значения
Данный метод возвращает объект PharData в случае успешного выполнения и
null в случае возникновения ошибки.
Ошибки
Данный метод выбрасывает исключение BadMethodCallException в следующих случаях: при невозможности сжатия; если был передан неизвестный алгоритм сжатия; в запрошенном архиве была включена буферизация с помощью Phar::startBuffering() и не была завершена с помощью Phar::stopBuffering(). В случае возникновения каких-либо проблем в процессе создания phar будет выброшено исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
format, compression и extension теперь допускают значение null.
|
Смотрите также
- Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
- PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив
- PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::convertToExecutablePhar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharСменить формат поставки, сохранив исходник. Нужен исполняемый формат Phar. Преобразование создаёт новую оболочку; полезное приложение ещё требует осмысленного стартового PHP-файла и загрузчика.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$converted = $archive->convertToExecutable(Phar::TAR, Phar::NONE);
if ($converted === null) { throw new RuntimeException('Конвертация не выполнена'); }
echo "Новый контейнер содержит:\n", $converted['receipt.txt']->getContent();
echo "Исходный контейнер по-прежнему содержит:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Новый контейнер содержит:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходный контейнер по-прежнему содержит:
Получить заказ в пункте № 3.
Метод создаёт новый файл и возвращает соответствующий объект, а не переименовывает исходный объект на месте. Незавершённая буферизация, неизвестный формат/кодек, несовместимое расширение или занятое целевое имя вызывают отказ. PharData не принимает нативный формат PHAR для convertToData.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$format = null, ?int $compression = null, ?string $extension = null): ?PharЗамечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Этот метод используется для конвертирования phar-архива в другой формат файла. Например, он может быть использован для создания исполняемого phar-архива, основанного на tar, из исполняемого phar-архива, основанного на zip, или из исполняемого phar-архива с форматом файла phar. Кроме того, данный метод может быть использован для сжатия целого архива, основанного на tar или phar.
Если не были указаны никакие изменения, то данный метод выбросит исключение BadMethodCallException.
В случае успешного выполнения данный метод создаёт на диске новый архив и возвращает объект Phar. Старый архив не удаляется с диска, это должно быть сделано вручную после завершения процесса.
Список параметров
format-
Значением этого параметра должна быть одна из констант:
Phar::PHAR,Phar::TARилиPhar::ZIP. Если значение установлено вnull, то существующий формат файла будет сохранён. compression-
Значением этого параметра должна быть одна из констант:
Phar::NONEдля отсутствия сжатия всего архива,Phar::GZдля сжатия, основанного на zlib, илиPhar::BZ2для bzip-сжатия. extension-
Этот параметр используется для переопределения расширение файла по умолчанию для сконвертированного архива. Обратите внимание, что все phar-архивы, основанные на tar или zip, должны содержать
.pharв расширении файла чтобы они могли быть обработаны в качестве phar-архива.В случае конвертации архива, основанного на phar, расширениями по умолчанию являются
.phar,.phar.gzи.phar.bz2, в зависимости от указанного сжатия. В случае конвертации phar-архива, основанного на tar, расширениями по умолчанию являются.phar.tar,.phar.tar.gzи.phar.tar.bz2. Для архивов, основанных на zip, расширением по умолчанию является.zip.
Возвращаемые значения
Данный метод возвращает объект Phar в успешного выполнения и
null в случае возникновения ошибки.
Ошибки
Данный метод выбрасывает исключение BadMethodCallException в следующих случаях: при невозможности сжатия; если был передан неизвестный алгоритм сжатия; в запрошенном архиве была включена буферизация с помощью Phar::startBuffering() и не была завершена с помощью Phar::stopBuffering(). Если поддержка записи отключена, то будет брошено исключение UnexpectedValueException. В случае возникновения каких-либо проблем в процессе создания phar выбрасывается исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
format, compression и extension теперь допускают значение null.
|
Смотрите также
- Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
- PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив
- PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::compressPharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::compress(int $compression, ?string $extension = null): ?PharDataПередать сжатый контейнер и вернуть читаемый чек. Весь tar-контейнер обёрнут gzip. Метод возвращает новый объект; исходный $archive продолжает обозначать исходный архив, поэтому результат сохраняем в отдельную переменную.
Phar::GZ выбирает gzip; $packed хранит объект нового файла. Выбор Phar::BZ2 требует bz2. Не проверяйте возвращаемый объект через === true.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.tar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$packed = $archive->compress(Phar::GZ);
if ($packed === null) { throw new RuntimeException('Нет сжатого архива'); }
echo 'Создан ', basename($packed->getPath()), ":\n", $packed['receipt.txt']->getContent();
Ожидаемый результат
Создан orders.tar.gz:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
На диске остаются оба контейнера. Для ZIP сжатие целого файла через этот метод не поддерживается; используйте compressFiles для записей. decompression создаёт новое имя, чтобы не перезаписать исходный orders.tar. Восстановление контейнера ещё не извлечение его документов.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Для tar-архивов, этот метод произведёт сжатие всего архива с помощью gzip или bzip2. Результирующий файл можно распаковать с помощью команд gunzip или bunzip, либо использовать напрямую через модуль Phar.
Для zip-архивов этот метод выбросит исключение. Для gzip-сжатия должен быть доступен модуль zlib. Для bzip2-сжатия должен быть доступен модуль bzip2.
Этот метод переименовывает архив, добавляя к его имени расширение .gz,
.bz2 или наоборот, убирающее его, если параметр типа сжатия задан как
Phar::NONE. Также можно явно указать, какое расширение будет
иметь файл.
Список параметров
compression-
Одна из констант:
Phar::GZ,Phar::BZ2, илиPhar::NONEдля отключения компрессии. extension-
По умолчанию файлу назначится расширение
.tar.gzили.tar.bz2для сжатия и.tar, если сжатие отключено.
Возвращаемые значения
Возвращает объект PharData в случае успешного выполнения или null в случае возникновения ошибки.
Ошибки
Выбрасывает исключение BadMethodCallException, если недоступен модуль zlib или выключен модуль bzip2.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
extension теперь допускает значение null.
|
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::decompressPharData::decompress — Распаковать весь Phar-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::decompress(?string $extension = null): ?PharDataПередать сжатый контейнер и вернуть читаемый чек. Весь tar-контейнер обёрнут gzip. Метод возвращает новый объект; исходный $archive продолжает обозначать исходный архив, поэтому результат сохраняем в отдельную переменную.
Phar::GZ выбирает gzip; $packed хранит объект нового файла. Выбор Phar::BZ2 требует bz2. Не проверяйте возвращаемый объект через === true.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.tar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$packed = $archive->compress(Phar::GZ);
if ($packed === null) { throw new RuntimeException('Нет сжатого архива'); }
$restored = $packed->decompress('restored.tar');
if ($restored === null) { throw new RuntimeException('Нет распакованного архива'); }
echo 'Создан ', basename($restored->getPath()), ":\n", $restored['receipt.txt']->getContent();
Ожидаемый результат
Создан orders.restored.tar:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
На диске остаются оба контейнера. Для ZIP сжатие целого файла через этот метод не поддерживается; используйте compressFiles для записей. decompression создаёт новое имя, чтобы не перезаписать исходный orders.tar. Восстановление контейнера ещё не извлечение его документов.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Для архивов типа tar, этот метод распаковывает весь архив.
Для архивов типа Zip этот метод выбросит исключение. Для разжатия gzip-архивов должен быть включён модуль zlib, а для bzip2, соответственно, модуль bzip2.
Также этот метод автоматически меняет расширение файла, по умолчанию
.tar. Расширение можно указать явно с помощью параметра
extension.
Список параметров
extension-
По умолчанию при распаковке файлу меняется расширение на
.tar. С помощью этого параметра можно явно указать новое расширение. Будьте осторожны, только запускаемые архивы могут содержать.pharв своих именах.
Возвращаемые значения
Возвращает объект типа PharData в случае успешного выполнения и null в случае возникновения ошибки.
Ошибки
Выбрасывает исключение BadMethodCallException, если отсутствует модуль, необходимый для распаковки: zlib или bzip2.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
extension теперь допускает значение null.
|
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- PharData::compressFiles() - Сжать все файлы в текущем tar/zip-архиве
- PharData::decompressFiles() - Распаковывает все файлы в текущем zip-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::compressFilesPharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::compressFiles(int $compression): voidСменить хранение записей, сохранив оба документа. Сжатие применяется к записям текущего контейнера. Цель — прежние имена и точные тексты. Вручную gzdecode над getContent не нужен.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->compressFiles(Phar::GZ);
echo "Чек после изменения хранения:\n", $archive['receipt.txt']->getContent();
echo "Памятка после изменения хранения:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Чек после изменения хранения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Памятка после изменения хранения:
Получить заказ в пункте № 3.
Текущий ZIP поддерживает отдельное сжатие. TAR этой возможности не имеет: его сжимают целиком. Для изменения уже сжатых записей нужен и декодер старого алгоритма, и кодер нового.
Перед чтением контракта. Версионное уточнение для PHP 8.5.11: compressFiles принимает Phar::GZ или Phar::BZ2. Упоминание Phar::NONE как способа распаковки в старом тексте ниже не соответствует проверке аргумента в этой реализации. Для снятия сжатия используйте отдельный decompressFiles или PharFileInfo::decompress; оба пути и проверка восстановленного текста разобраны выше.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Для tar-архивов данный метод выбросит исключение BadMethodCallException, так как сжатие отдельных файлов в tar-архиве не поддерживается форматом файла. Используйте PharData::compress() для сжатия всего tar-архива.
Для Zip-архивов этот метод сожмёт все файлы используя заданный тип сжатия. Для корректной работы требуются включённые модули zlib или bzip2, в зависимости от типа сжатия. Также, если некоторые файлы уже были сжаты, то необходимо, чтобы соответствующий модуль был включён, иначе не удастся обработать.
Список параметров
compression-
Одна из констант:
Phar::GZ,Phar::BZ2илиPhar::NONE, для отмены сжатия.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбрасывает исключение BadMethodCallException если выключена INI-опция phar.readonly, если отсутствует необходимый модуль zlib или bzip2.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- PharData::decompressFiles() - Распаковывает все файлы в текущем zip-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- PharData::decompress() - Распаковать весь Phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::decompressFilesPharData::decompressFiles — Распаковывает все файлы в текущем zip-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::decompressFiles(): trueСменить хранение записей, сохранив оба документа. Сжатие применяется к записям текущего контейнера. Цель — прежние имена и точные тексты. Для групповой распаковки сначала проверяем результат и показываем обход обнаруженного ограничения нашей сборки.
copy сохраняет отдельный учебный вход. $complete собирает результат двух сравнений; при расхождении читаем заново неизменённый источник, а PharFileInfo::decompress распаковывает каждую запись отдельно. Это проверка маленьких собственных файлов, а не универсальный способ исправить повреждённый чужой архив.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->compressFiles(Phar::GZ);
$saved = __DIR__ . '/packed-copy.zip';
if (!copy($path, $saved)) { throw new RuntimeException('Не сохранён вход получателя'); }
$archive = new PharData($saved);
$archive->decompressFiles();
$complete = true;
foreach (['receipt.txt', 'notice.txt'] as $name) {
if ($archive[$name]->getContent() !== file_get_contents(__DIR__ . '/input/' . $name)) { $complete = false; }
}
if (!$complete) {
echo "Групповая распаковка не прошла проверку; используем пофайловую из сохранённого входа\n";
$fallback = __DIR__ . '/per-entry.zip';
if (!copy($path, $fallback)) { throw new RuntimeException('Нет резервного входа'); }
$archive = new PharData($fallback);
foreach (['receipt.txt', 'notice.txt'] as $name) { $archive[$name]->decompress(); }
}
foreach (['receipt.txt', 'notice.txt'] as $name) {
if ($archive[$name]->getContent() !== file_get_contents(__DIR__ . '/input/' . $name)) { throw new RuntimeException('Нельзя выдавать неполный документ'); }
}
echo "Чек после изменения хранения:\n", $archive['receipt.txt']->getContent();
echo "Памятка после изменения хранения:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Групповая распаковка не прошла проверку; используем пофайловую из сохранённого входа
Чек после изменения хранения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Памятка после изменения хранения:
Получить заказ в пункте № 3.
Текущий ZIP поддерживает отдельное сжатие. TAR этой возможности не имеет: его сжимают целиком. Для изменения уже сжатых записей нужен и декодер старого алгоритма, и кодер нового. В проверенной PHP8.5.11 успешный return bulk-метода не обеспечил точное восстановление текста. Пример обнаруживает расхождение до вывода, использует неизменённый сжатый источник и рабочий PharFileInfo::decompress для каждой записи. Ожидаемый вывод фиксирует именно это наблюдение, а не обещает такой дефект у всех версий. Эталон здесь известен из собственных input-файлов; для внешнего обмена его получают доверенным способом.
Перед чтением контракта. Уточнение реализации PHP 8.5.11: для TAR этот метод завершает вызов без изменения записей; старое описание исключения не отражает этот путь. TAR сжимают и распаковывают целиком. Для PHAR/ZIP наш пример дополнительно сравнивает реальные восстановленные байты и показывает рабочий пофайловый путь, если групповая операция не дала исходный текст.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
При распаковке файлов в tar-архиве метод выбрасывает исключение BadMethodCallException, поскольку сжатие отдельных файлов в tar-архиве не поддерживается форматом файла. Для сжатия tar-архива пользуются методом PharData::compress().
В zip-архиве метод распаковывает все файлы. Для сжатия файлов методом bzip2 или zlib потребуется включить модуль, который соответствует формату сжатия, — bzip2 или zlib.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение BadMethodCallException, если модуль zlib недоступен, или если хотя бы один файл сжат методом bzip2, а модуль bzip2 не включили.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- PharData::compressFiles() - Сжать все файлы в текущем tar/zip-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
- PharData::decompress() - Распаковать весь Phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::convertToDataPharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharDataСменить формат поставки, сохранив исходник. Нужен неисполняемый TAR для обмена данными: загрузчик и псевдоним удаляются из нового контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$converted = $archive->convertToData(Phar::TAR, Phar::NONE);
if ($converted === null) { throw new RuntimeException('Конвертация не выполнена'); }
echo "Новый контейнер содержит:\n", $converted['receipt.txt']->getContent();
echo "Исходный контейнер по-прежнему содержит:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Новый контейнер содержит:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходный контейнер по-прежнему содержит:
Получить заказ в пункте № 3.
Метод создаёт новый файл и возвращает соответствующий объект, а не переименовывает исходный объект на месте. Незавершённая буферизация, неизвестный формат/кодек, несовместимое расширение или занятое целевое имя вызывают отказ. PharData не принимает нативный формат PHAR для convertToData.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$format = null, ?int $compression = null, ?string $extension = null): ?PharDataЭтот метод используется для преобразования незапускаемого tar/zip-архива в другой незапускаемый формат.
Если не указано никаких изменений, то будет выброшено исключение BadMethodCallException. Этот метод можно использовать для преобразования tar-архива в zip-архив и наоборот. Несмотря на то что, что можно изменить сжатие для tar-архива с помощью этого метода, для этих целей лучше использовать метод PharData::compress().
В случае успешного выполнения будет создан новый архив на диске и возвращён объект PharData. Старый архив удаляться не будет.
Список параметров
format-
Одна из констант:
Phar::TARилиPhar::ZIP. Если задать какnull, то будет использован текущий формат. compression-
Одна из констант:
Phar::NONE(для отключения сжатия всего архива),Phar::GZ(для zlib-сжатия),Phar::BZ2(для bzip-сжатия). extension-
Этот параметр используется для явного указания расширения нового архива. Обратите внимание, что для незапускаемых архивов ни в коем случае нельзя допускать появление подстроки
.pharв любом месте имени файла.По умолчанию для tar-архивов используются расширения:
.tar,.tar.gzи.tar.bz2. Для zip-архивов:.zip.
Ошибки
Метод выбрасывает исключениеBadMethodCallException когда не может произвести сжатие, когда задан неизвестный метод сжатия, для архива включена буферизация с помощью Phar::startBuffering(), и не отключена при помощи Phar::stopBuffering(). Исключение PharException выбрасывается при любых проблемах создания phar-архива.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
format, compression и extension теперь допускают значение null.
|
Смотрите также
- Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
- Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
- PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::convertToExecutablePharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharСменить формат поставки, сохранив исходник. Нужен исполняемый формат Phar. Преобразование создаёт новую оболочку; полезное приложение ещё требует осмысленного стартового PHP-файла и загрузчика.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$converted = $archive->convertToExecutable(Phar::PHAR, Phar::NONE);
if ($converted === null) { throw new RuntimeException('Конвертация не выполнена'); }
echo "Новый контейнер содержит:\n", $converted['receipt.txt']->getContent();
echo "Исходный контейнер по-прежнему содержит:\n", $archive['notice.txt']->getContent();
Ожидаемый результат
Новый контейнер содержит:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Исходный контейнер по-прежнему содержит:
Получить заказ в пункте № 3.
Метод создаёт новый файл и возвращает соответствующий объект, а не переименовывает исходный объект на месте. Незавершённая буферизация, неизвестный формат/кодек, несовместимое расширение или занятое целевое имя вызывают отказ. PharData не принимает нативный формат PHAR для convertToData.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$format = null, ?int $compression = null, ?string $extension = null): ?PharЗамечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Этот метод используется для конвертации незапускаемого tar/zip-архива а запускаемый phar-архив. Может быть использован любой из трёх запускаемых форматов (phar, tar или zip). Также допустимо сжатие архива целиком.
Если изменения не указаны, этот метод бросает исключение BadMethodCallException.
В случае успешного выполнения, этот метод создаёт новый архив на диске и возвращает объект Phar. Старый архив остаётся нетронутым.
Список параметров
format-
Одна из констант:
Phar::PHAR,Phar::TAR, илиPhar::ZIP. Если заданоnull, то будет сохранён текущий формат. compression-
Одна из констант:
Phar::NONE(без сжатия всего архива),Phar::GZ(zlib сжатие),Phar::BZ2(bzip сжатие). extension-
Этот параметр используется для явного задания расширения для нового архива. Обратите внимание, что для того, чтобы обрабатываться как phar-архив, файлы должны в своём расширении иметь
.phar.При конвертации в phar-архива, расширение по умолчанию
.phar,.phar.gzили.phar.bz2, в зависимости от заданного типа сжатия. Для tar-архивов, расширение по умолчанию.phar.tar,.phar.tar.gz, и.phar.tar.bz2. Для zip-архивов расширение по умолчанию.phar.zip.
Ошибки
Метод выбрасывает исключение BadMethodCallException если не может произвести сжатие, либо если задан неизвестный алгоритм сжатия, для архива включена буферизация с помощью Phar::startBuffering(), а метод Phar::stopBuffering() не вызывался. Выбрасывается исключение UnexpectedValueException, если запись запрещена. И выбрасывается PharException, если возникли проблемы записи на диск.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
format, compression и localName теперь допускают значение null.
|
Смотрите также
- Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
- Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
- PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::canCompressPhar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
final public static function Phar::canCompress(int $compression = 0): boolВыбрать доступный алгоритм и сохранить чек. Проверяем именно поддержку gzip до изменения данных; затем реально сжимаем запись и читаем её прежний текст.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if (!Phar::canCompress(Phar::GZ)) { throw new RuntimeException('Нужен zlib для этого обмена'); }
$archive->compressFiles(Phar::GZ);
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Проверка сообщает возможность расширения, но не гарантирует свободное место или успешную запись. BZIP2 проверяют отдельно; нулевой аргумент означает общую проверку доступных алгоритмов.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот метод следует использовать для проверки поддержки сжатия до загрузки phar-архива, содержащего сжатые файлы.
Список параметров
compression-
Может быть использована одна из констант
Phar::GZилиPhar::BZ2для проверки возможности сжатия по алгоритму zlib или bzip2 соответственно.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
- Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getSupportedCompressionPhar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
final public static function Phar::getSupportedCompression(): arrayВыбрать gzip из списка возможностей. Список используется как договор подготовки поставки: если есть GZ, можно сжать документы выбранным алгоритмом.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$supported = Phar::getSupportedCompression();
if (!in_array('GZ', $supported, true)) { throw new RuntimeException('Сборка не поддерживает GZ'); }
$archive->compressFiles(Phar::GZ);
echo "Выбран gzip; получатель читает:\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Выбран gzip; получатель читает:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение к краткому тексту PHP Manual: реализация PHP8.5.11 возвращает строковые названия GZ и BZIP2, а не числовые значения констант Phar::GZ/Phar::BZ2. Метод сжатия всё равно получает константу. Это проверено по исходнику ext/phar/phar_object.c и реальному примеру.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Список параметров
Нет параметров.
Возвращаемые значения
Возвращает массив, содержащий любые из значений Phar::GZ или
Phar::BZ2 в зависимости от доступности модулей
zlib и bz2.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::isCompressedPhar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::isCompressed(): int|falseРаспознать сжатие всего контейнера. Проверка объекта $packed относится ко всему orders.phar.gz. Состояние отдельного receipt.txt проверял бы PharFileInfo::isCompressed.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$packed = $archive->compress(Phar::GZ);
if ($packed === null || $packed->isCompressed() !== Phar::GZ) { throw new RuntimeException('Не получен gzip-контейнер'); }
echo "Чтение прямо из orders.phar.gz:\n", $packed['receipt.txt']->getContent();
Ожидаемый результат
Чтение прямо из orders.phar.gz:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Чтение через Phar само декодирует контейнер. compress возвращает новый объект: проверять isCompressed на старом $archive после compress — значит задавать вопрос об исходном файле.
Перед чтением контракта. isCompressed только читает признаки контейнера; для этого чтения не требуется отключать phar.readonly. В нашем примере разрешение записи нужно предыдущему compress, который создаёт тестовый вход.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее).
Phar-архивы, основанные на zip, не могут быть сжаты целиком, поэтому этот
метод всегда возвращает false, если он был вызван на phar-архиве, основанном на zip.
Список параметров
Нет параметров.
Возвращаемые значения
Phar::GZ, Phar::BZ2 или false.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::isFileFormatPhar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::isFileFormat(int $format): boolВыбрать допустимую операцию по формату. TAR не поддерживает отдельное сжатие записей, а нативный PHAR поддерживает. Проверка формата выбирает действие, после которого читатель получает тот же чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if ($archive->isFileFormat(Phar::PHAR)) { $archive->compressFiles(Phar::GZ); }
else { throw new RuntimeException('Для этого формата выберите другой способ сжатия'); }
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Формат, алгоритм сжатия и признак исполняемости — разные свойства. Не определяйте их только по окончанию имени; неизвестная константа формата может вызвать исключение.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Список параметров
format-
Phar::PHAR,Phar::TARилиPhar::ZIP, в зависимости от проверяемого формата.
Возвращаемые значения
Возвращает true, если phar-архив имеет указанный формат
Ошибки
В случае задания некорректного формата выбрасывается исключение PharException.
Смотрите также
- Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
- Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::__constructPharFileInfo::__construct — Конструктор объекта PharFileInfo
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::__construct(string $filename)Получить содержимое конкретного документа. Объект PharFileInfo представляет receipt.txt, а не весь контейнер. Получаем его через $archive["receipt.txt"], как рекомендует официальный контракт конструктора.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Для обычного приложения прямой вызов конструктора/деструктора не нужен. Объект создаётся при выборе записи; unset освобождает нашу переменную, но не удаляет документ. Отсутствующее имя и ошибочный phar:// путь обрабатываются как отказ чтения.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Не должен вызываться напрямую. Объект PharFileInfo следует инициализировать с помощью Phar::offsetGet(), используя синтаксис доступа к массиву.
Список параметров
filename-
Полный URL файла. Если вы хотите извлечь файл
my/file.phpиз архиваboo.phar, необходимо задатьphar://boo.phar/my/file.php.
Ошибки
Выбрасывает исключение BadMethodCallException, если __construct() вызван дважды. Выбрасывает исключение UnexpectedValueException, если запрошенный URL некорректен, phar-архив невозможно открыть либо если указанный файл отсутствует в архиве.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::getContentPharFileInfo::getContent — Получить полное содержимое файла записи
(PHP 5 >= 5.3.0, PHP 7, PHP 8) · Phar
public function PharFileInfo::getContent(): stringПолучить содержимое конкретного документа. Объект PharFileInfo представляет receipt.txt, а не весь контейнер. Получаем его через $archive["receipt.txt"], как рекомендует официальный контракт конструктора.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Для обычного приложения прямой вызов конструктора/деструктора не нужен. Объект создаётся при выборе записи; unset освобождает нашу переменную, но не удаляет документ. Отсутствующее имя и ошибочный phar:// путь обрабатываются как отказ чтения.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Эта функция ведёт себя как file_get_contents(), но для Phar.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает содержимое файла.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::__destructPharFileInfo::__destruct — Уничтожает входной объект Phar
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::__destruct()Получить содержимое конкретного документа. Объект PharFileInfo представляет receipt.txt, а не весь контейнер. Получаем его через $archive["receipt.txt"], как рекомендует официальный контракт конструктора.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
unset($entry);
$entry = $archive['receipt.txt'];
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Для обычного приложения прямой вызов конструктора/деструктора не нужен. Объект создаётся при выборе записи; unset освобождает нашу переменную, но не удаляет документ. Отсутствующее имя и ошибочный phar:// путь обрабатываются как отказ чтения.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Список параметров
Сигнатура функции не содержит параметров.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::compressPharFileInfo::compress — Сжимает текущий файл методом zlib или bzip2
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharFileInfo::compress(int $compression): trueИзменить хранение одного чека. Сжимаем только receipt.txt; памятка и весь внешний контейнер не обязаны менять свой режим. Пользователь должен прочитать исходные строки, независимо от хранения.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->compress(Phar::GZ);
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
getContent возвращает распакованный текст. getCompressedSize измеряет байты хранения данной записи, а не размер всего ZIP/Phar и не число символов. Короткий текст после сжатия может увеличиться; для TAR отдельное сжатие записей не предусмотрено.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод сжимает файл в phar-архиве методом сжатия bzip2 или zlib. Для работы метода потребуется включить модуль bzip2 или zlib. Для распаковки уже сжатого файла также потребуется включить модуль, который соответствует методу сжатия. Как и с остальными функциями, которые изменяют содержимое phar-архива, для сжатия файла в Phar-архиве потребуется отключить INI-переменную phar.readonly; директива не ограничивает обработку архивов, с которыми работает класс PharData.
Возвращаемые значения
Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.
Ошибки
Метод выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, или если модуль bzip2 или zlib недоступен.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::decompressPharFileInfo::decompress — Распаковывает Phar-файл в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharFileInfo::decompress(): trueИзменить хранение одного чека. Сжимаем только receipt.txt; памятка и весь внешний контейнер не обязаны менять свой режим. Пользователь должен прочитать исходные строки, независимо от хранения.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->compress(Phar::GZ);
$entry->decompress();
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
getContent возвращает распакованный текст. getCompressedSize измеряет байты хранения данной записи, а не размер всего ZIP/Phar и не число символов. Короткий текст после сжатия может увеличиться; для TAR отдельное сжатие записей не предусмотрено.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод распаковывает файл в phar-архиве. Для работы функции потребуется включить модуль bzip2 или zlib, в зависимости от метода сжатия файла внутри архива. Как и с остальными функциями, которые изменяют содержимое phar-архива, для распаковки файла в Phar-архиве потребуется отключить INI-переменную phar.readonly; директива не ограничивает обработку архивов, с которыми работает класс PharData.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Функция возвращает логическое значение true.
Ошибки
Метод выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, или если модуль bzip2 или zlib недоступен.
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::isCompressedPharFileInfo::isCompressed — Проверить, сжат ли файл
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::isCompressed(?int $compression = null): boolИзменить хранение одного чека. Сжимаем только receipt.txt; памятка и весь внешний контейнер не обязаны менять свой режим. Пользователь должен прочитать исходные строки, независимо от хранения.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->compress(Phar::GZ);
if (!$entry->isCompressed(Phar::GZ)) { throw new RuntimeException('Запись не сжата выбранным способом'); }
echo $entry->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
getContent возвращает распакованный текст. getCompressedSize измеряет байты хранения данной записи, а не размер всего ZIP/Phar и не число символов. Короткий текст после сжатия может увеличиться; для TAR отдельное сжатие записей не предусмотрено.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Проверяет, сжат ли файл внутри Phar-архива с помощью Gzip или Bzip2.
Список параметров
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
compression теперь допускает значение null.
|
Смотрите также
- PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::getCompressedSizePharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::getCompressedSize(): intИзменить хранение одного чека. Сжимаем только receipt.txt; памятка и весь внешний контейнер не обязаны менять свой режим. Пользователь должен прочитать исходные строки, независимо от хранения.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->compress(Phar::GZ);
$storedBytes = $entry->getCompressedSize();
file_put_contents(__DIR__ . '/storage.txt', 'Байтов хранения: ' . $storedBytes);
echo "Размер хранения записан в storage.txt; восстановленный документ:\n";
echo $entry->getContent();
Ожидаемый результат
Размер хранения записан в storage.txt; восстановленный документ:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
getContent возвращает распакованный текст. getCompressedSize измеряет байты хранения данной записи, а не размер всего ZIP/Phar и не число символов. Короткий текст после сжатия может увеличиться; для TAR отдельное сжатие записей не предусмотрено.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает реально занимаемое файлом место с учётом сжатия. Для несжатого файла вернётся такое же значение, что и с помощью filesize()
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Размер файла в байтах.
Смотрите также
- PharFileInfo::isCompressed() - Проверить, сжат ли файл
- PharFileInfo::decompress() - Распаковывает Phar-файл в phar-архиве
- PharFileInfo::compress() - Сжимает текущий файл методом zlib или bzip2
- Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
- Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
- Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
- Phar::decompress() - Распаковывает весь Phar-архив
- Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
- Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
- Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::setMetadataPharFileInfo::setMetadata — Установка метаданных для конкретного файла
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::setMetadata(mixed $metadata): voidНазвать документ, не меняя его текст. Название для интерфейса хранится отдельно от байтов чека. Метаданные записи отличаются от глобальных метаданных всей поставки.
["title" => ...] связывает ключ и значение; ?? null даёт запасное значение при отсутствующем ключе. Метаданные null считаются отсутствующими.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->setMetadata(['title' => 'Чек заказа 42', 'contentType' => 'text/plain']);
if (!$entry->hasMetadata()) { throw new RuntimeException('Нет названия документа'); }
$metadata = $entry->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['title'] ?? null)) { throw new RuntimeException('Неверное пояснение'); }
$title = $metadata['title'];
echo $title, ":\n", $entry->getContent();
Ожидаемый результат
Чек заказа 42:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В примере хранится только маленький массив строк. Чтение метаданных десериализует значение; allowed_classes=false запрещает создание классов, max_depth ограничивает вложенность, а последующая проверка контролирует схему. Это не делает недоверенный исполняемый пакет безопасным для require.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
PharFileInfo::setMetadata() следует использовать для сохранения метаданных конкретного файла, которые нельзя хранить внутри самого файла, поскольку, если данных много, либо в принципе много файлов с метаданными - это значительно замедляет загрузку phar-архива. Важно помнить, что phar-архивы из коробки поддерживают права на файлы и их можно задать с помощью метода PharFileInfo::chmod(). Так как эта функциональность изменяет phar-архив, необходимо, чтобы опция phar.readonly была отключена, иначе внести изменения в архив Phar не получится. На архивы PharData ограничение на запись не распространяется.
Метаданные файлов можно использовать, например, для указания, какие права надо назначить файлу при экспорте его на диск, или для указания MIME-типа, который он возвращает. В общем - любая полезная информация, которой не место внутри самого файла.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Смотрите также
- PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
- PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
- PharFileInfo::delMetadata() - Удаляет метаданные отдельного файла в архиве
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
- Phar::getMetadata() - Извлечь метаданные phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::getMetadataPharFileInfo::getMetadata — Получить метаданные, связанные с файлом
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::getMetadata(array $unserializeOptions = []): mixedНазвать документ, не меняя его текст. Название для интерфейса хранится отдельно от байтов чека. Метаданные записи отличаются от глобальных метаданных всей поставки.
["title" => ...] связывает ключ и значение; ?? null даёт запасное значение при отсутствующем ключе. Метаданные null считаются отсутствующими.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->setMetadata(['title' => 'Чек заказа 42', 'contentType' => 'text/plain']);
if (!$entry->hasMetadata()) { throw new RuntimeException('Нет названия документа'); }
$metadata = $entry->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['title'] ?? null)) { throw new RuntimeException('Неверное пояснение'); }
$title = $metadata['title'];
echo $title, ":\n", $entry->getContent();
Ожидаемый результат
Чек заказа 42:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В примере хранится только маленький массив строк. Чтение метаданных десериализует значение; allowed_classes=false запрещает создание классов, max_depth ограничивает вложенность, а последующая проверка контролирует схему. Это не делает недоверенный исполняемый пакет безопасным для require.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает метаданные, связанные с файлом.
Список параметров
Возвращаемые значения
Любая переменная PHP, которая может быть сериализована и сохранена в виде метаданных
файла, либо null, если метаданных нет.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
Добавлен параметр unserializeOptions.
|
Смотрите также
- PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
- PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
- PharFileInfo::delMetadata() - Удаляет метаданные отдельного файла в архиве
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
- Phar::getMetadata() - Извлечь метаданные phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::hasMetadataPharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
public function PharFileInfo::hasMetadata(): boolНазвать документ, не меняя его текст. Название для интерфейса хранится отдельно от байтов чека. Метаданные записи отличаются от глобальных метаданных всей поставки.
["title" => ...] связывает ключ и значение; ?? null даёт запасное значение при отсутствующем ключе. Метаданные null считаются отсутствующими.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->setMetadata(['title' => 'Чек заказа 42', 'contentType' => 'text/plain']);
if (!$entry->hasMetadata()) { throw new RuntimeException('Нет названия документа'); }
$metadata = $entry->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['title'] ?? null)) { throw new RuntimeException('Неверное пояснение'); }
$title = $metadata['title'];
echo $title, ":\n", $entry->getContent();
Ожидаемый результат
Чек заказа 42:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В примере хранится только маленький массив строк. Чтение метаданных десериализует значение; allowed_classes=false запрещает создание классов, max_depth ограничивает вложенность, а последующая проверка контролирует схему. Это не делает недоверенный исполняемый пакет безопасным для require.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Список параметров
Нет параметров.
Возвращаемые значения
Возвращает false или true (метаданные, равные null, считаются за отсутствие метаданных)
Смотрите также
- PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
- PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
- PharFileInfo::delMetadata() - Удаляет метаданные отдельного файла в архиве
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
- Phar::getMetadata() - Извлечь метаданные phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::delMetadataPharFileInfo::delMetadata — Удаляет метаданные отдельного файла в архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
public function PharFileInfo::delMetadata(): trueНазвать документ, не меняя его текст. Название для интерфейса хранится отдельно от байтов чека. Метаданные записи отличаются от глобальных метаданных всей поставки.
["title" => ...] связывает ключ и значение; ?? null даёт запасное значение при отсутствующем ключе. Метаданные null считаются отсутствующими.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->setMetadata(['title' => 'Чек заказа 42', 'contentType' => 'text/plain']);
$entry->delMetadata();
$title = $entry->hasMetadata() ? 'Есть пояснение' : 'Чек без дополнительного пояснения';
echo $title, ":\n", $entry->getContent();
Ожидаемый результат
Чек без дополнительного пояснения:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В примере хранится только маленький массив строк. Чтение метаданных десериализует значение; allowed_classes=false запрещает создание классов, max_depth ограничивает вложенность, а последующая проверка контролирует схему. Это не делает недоверенный исполняемый пакет безопасным для require.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод удаляет метаданные конкретного файла, если файл содержит метаданные.
Список параметров
У метода нет параметров.
Возвращаемые значения
Функция возвращает логическое значение true.
Как и с остальными функциями, которые изменяют
содержимое phar-архива, для удаления метаданных файла в Phar-архиве потребуется отключить
INI-переменную phar.readonly;
директива не ограничивает обработку архивов, с которыми работает класс
PharData.
Ошибки
Метод выбрасывает исключение PharException, если возникла ошибка при записи изменений диск, и исключение BadMethodCallException, если доступ на запись запретили.
Смотрите также
- PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
- PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
- PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
- Phar::getMetadata() - Извлечь метаданные phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::chmodPharFileInfo::chmod — Установка прав доступа
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::chmod(int $perms): voidУбрать исполняемые биты у текстового документа. В контейнере чек должен оставаться обычными данными. Настраиваем разрешения чтения, затем всё равно читаем текст через объект.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$entry->chmod(0644);
if (($entry->getPerms() & 0111) !== 0) { throw new RuntimeException('Текст помечен исполняемым'); }
echo "Чек без исполняемых битов:\n", $entry->getContent();
Ожидаемый результат
Чек без исполняемых битов:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Начальный 0 означает восьмеричную запись битов прав; &0111 выбирает биты исполнения. Поведение прав ОС при извлечении, особенно Windows, отличается от этих метаданных. Права не заменяют запрет выполнять чужой PHP.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
PharFileInfo::chmod() позволяет устанавливать биты разрешений на запуск и чтение для файлов. Биты записи игнорируются, поскольку настраиваются во время исполнения на основании значения INI-переменной phar.readonly. Как и для любого другого функционала, модифицирующего phar-архив, необходимо, чтобы переменная phar.readonly была отключена для успешного изменения прав на файл в архиве Phar. Архивы PharData не имеют таких ограничений.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::getCRC32PharFileInfo::getCRC32 — Получить контрольную сумму CRC32
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::getCRC32(): intПроверить повреждение перед использованием чека. Сначала читаем запись: при нормальном чтении Phar проверяет CRC. Затем используем состояние проверки или сравниваем контрольную сумму тех же байтов.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$text = $entry->getContent();
if (sprintf('%u', $entry->getCRC32()) !== sprintf('%u', crc32($text))) { throw new RuntimeException('CRC текста не совпал'); }
echo "Прочитан проверенный на повреждение чек:\n", $text;
Ожидаемый результат
Прочитан проверенный на повреждение чек:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
CRC32 предназначен для обнаружения случайного повреждения. Автор, способный подменить текст, способен пересчитать CRC; доверие к поставщику требует другого механизма. До проверки чтением getCRC32 может бросить BadMethodCallException.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает контрольную сумму crc32() для файла в Phar-архиве.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Контрольная сумма crc32() для файла в Phar-архиве.
Ошибки
Выбрасывает исключение BadMethodCallException, если не удалось верифицировать контрольную сумму CRC32. Этого практически невозможно добиться при обычной работе, так как контрольная сумма проверяется при чтении и записи файла.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::isCRCCheckedPharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::isCRCChecked(): boolПроверить повреждение перед использованием чека. Сначала читаем запись: при нормальном чтении Phar проверяет CRC. Затем используем состояние проверки или сравниваем контрольную сумму тех же байтов.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
$text = $entry->getContent();
if (!$entry->isCRCChecked()) { throw new RuntimeException('Целостность записи не проверена'); }
echo "Прочитан проверенный на повреждение чек:\n", $text;
Ожидаемый результат
Прочитан проверенный на повреждение чек:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
CRC32 предназначен для обнаружения случайного повреждения. Автор, способный подменить текст, способен пересчитать CRC; доверие к поставщику требует другого механизма. До проверки чтением getCRC32 может бросить BadMethodCallException.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Определяет, прошёл ли файл проверку CRC.
Список параметров
Сигнатура функции не содержит параметров.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharFileInfo::getPharFlagsPharFileInfo::getPharFlags — Получить флаги файла в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function PharFileInfo::getPharFlags(): intНе перепутать служебные флаги с правами и сжатием. Метод возвращает оставшиеся флаги записи, без битов разрешений и сжатия. Для текущего обычного чека они нулевые; это не означает отсутствие содержимого.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$entry = $archive['receipt.txt'];
if ($entry->getPharFlags() !== 0) { throw new RuntimeException('Неожиданные служебные флаги нашего формата'); }
echo "Обычная запись без дополнительных флагов:\n", $entry->getContent();
Ожидаемый результат
Обычная запись без дополнительных флагов:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Не используйте getPharFlags для решения, нужна ли распаковка или какие права установить. Для этих задач есть isCompressed/getPerms; текущий официальный контракт описывает нулевой результат.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает набор флагов, заданных в манифесте Phar-архива.
В текущей реализации всегда возвращает 0.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Флаги Phar-архива (пока всегда 0)
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::apiVersionPhar::apiVersion — Возвращает версию API
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
final public static function Phar::apiVersion(): stringВыбрать формат, способный хранить пустую папку. Версия формата Phar отличается от версии PHP. В API 1.1.1 появилась поддержка пустых директорий; используем эту границу для поставки.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$version = Phar::apiVersion();
if (version_compare($version, '1.1.1', '<')) { throw new RuntimeException('Нужен формат с пустыми папками'); }
$archive->addEmptyDir('acts');
if (!$archive['acts']->isDir()) { throw new RuntimeException('В контейнере нет папки acts'); }
$archive->extractTo(__DIR__ . '/received', ['receipt.txt', 'notice.txt'], false);
if (!mkdir(__DIR__ . '/received/acts', 0700)) { throw new RuntimeException('Не создана папка для актов'); }
echo "Формат позволяет выдать папку received/acts вместе с чеком:\n";
echo file_get_contents(__DIR__ . '/received/receipt.txt');
Ожидаемый результат
Формат позволяет выдать папку received/acts вместе с чеком:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
apiVersion сообщает формат, который создаёт загруженное расширение; getVersion читает версию конкретного архива. Версия 1.1.0 добавила SHA256/SHA512, 1.0.0 — исходный читаемый формат. version_compare сравнивает версии по компонентам. В проверенной PHP 8.5.11 extractTo не создал самостоятельную пустую директорию: поэтому после проверки записи получатель явно создаёт свой известный received/acts и читает действительно извлечённый чек.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает версию API формата phar-файла, которая будет использована для создания архивов. Модуль Phar поддерживает чтение начиная с версии API 1.0.0. Для использования хешей SHA-256 и SHA-512 требуется версия API 1.1.0, а для хранения пустых директорий требуется версия API 1.1.1.
Список параметров
Возвращаемые значения
Строка версии API, как в "1.0.0".
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getVersionPhar::getVersion — Получить версию Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::getVersion(): stringВыбрать формат, способный хранить пустую папку. Версия формата Phar отличается от версии PHP. В API 1.1.1 появилась поддержка пустых директорий; используем эту границу для поставки.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$version = $archive->getVersion();
if (version_compare($version, '1.1.1', '<')) { throw new RuntimeException('Нужен формат с пустыми папками'); }
$archive->addEmptyDir('acts');
if (!$archive['acts']->isDir()) { throw new RuntimeException('В контейнере нет папки acts'); }
$archive->extractTo(__DIR__ . '/received', ['receipt.txt', 'notice.txt'], false);
if (!mkdir(__DIR__ . '/received/acts', 0700)) { throw new RuntimeException('Не создана папка для актов'); }
echo "Формат позволяет выдать папку received/acts вместе с чеком:\n";
echo file_get_contents(__DIR__ . '/received/receipt.txt');
Ожидаемый результат
Формат позволяет выдать папку received/acts вместе с чеком:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
apiVersion сообщает формат, который создаёт загруженное расширение; getVersion читает версию конкретного архива. Версия 1.1.0 добавила SHA256/SHA512, 1.0.0 — исходный читаемый формат. version_compare сравнивает версии по компонентам. В проверенной PHP 8.5.11 extractTo не создал самостоятельную пустую директорию: поэтому после проверки записи получатель явно создаёт свой известный received/acts и читает действительно извлечённый чек.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Список параметров
Возвращаемые значения
Версия API открытого архива. Не перепутайте с версией API загруженного модуля phar. Каждый Phar-архив имеет жёстко прописанную версию API, с помощью которого его создавали, в манифесте. Подробную документацию можно почитать на странице Формат файла Phar.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::canWritePhar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
final public static function Phar::canWrite(): boolОстановить сборку до изменения файлов при запрете записи. Статическая проверка читает настройку Phar в текущем PHP-процессе. В учебном build-процессе разрешаем запись явным флагом и реально сохраняем чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
if (!Phar::canWrite()) { throw new RuntimeException('Сборку запускают: php -d phar.readonly=0 example.php'); }
require __DIR__ . '/bootstrap.php';
$archive['receipt.txt'] = "Заказ 42: сборка завершена\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42: сборка завершена
canWrite не проверяет конкретную папку, свободное место или владение файлом. phar.readonly нельзя выключить через ini_set, если он был включён при старте; общий серверный php.ini ради сборки не меняем.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот статический метод определяет, был ли отключён доступ на запись в системном файле php.ini с использованием переменной phar.readonly.
Список параметров
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::startBufferingPhar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::startBuffering(): voidЗаписать согласованное обновление двух документов. Чек и памятка меняются одной серией. startBuffering откладывает запись на диск, stopBuffering сохраняет подготовленное; это сокращает повторную упаковку контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->startBuffering();
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
$archive['notice.txt'] = "Памятка обновлена вместе с чеком\n";
$archive->stopBuffering();
echo $archive['receipt.txt']->getContent(), $archive['notice.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Памятка обновлена вместе с чеком
Буферизация относится к одному объекту/архиву; она не даёт транзакционных гарантий базы данных и не предоставляет rollback. Чтение через тот же объект может видеть подготовленные изменения. При ошибке stopBuffering сборку нельзя выдавать как готовую.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод Phar::startBuffering() может дать значительный прирост производительности при создании, либо модификации phar-архива с большим количеством файлов. Обычно, когда добавляется новый файл, либо изменяется существующий, запускается операция пересоздания phar-архива. С включённой буферизацией архив будет пересоздан один раз в самом конце внесения изменений.
Эта концепция работает аналогично транзакции в базе данных, что позволяет сделать вне необходимые изменения и применить их одновременно, в рамках одной операции. Такое поведение обеспечивает пара методов Phar::startBuffering()/Phar::stopBuffering().
Настройки буферизации индивидуальны для каждого архива.
Включённая буферизация для foo.phar никак не влияет
на режим работы с bar.phar.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Смотрите также
- Phar::stopBuffering() - Останавливает буферизацию и записывает все изменения на диск
- Phar::isBuffering() - Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::stopBufferingPhar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::stopBuffering(): voidЗаписать согласованное обновление двух документов. Чек и памятка меняются одной серией. startBuffering откладывает запись на диск, stopBuffering сохраняет подготовленное; это сокращает повторную упаковку контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->startBuffering();
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
$archive['notice.txt'] = "Памятка обновлена вместе с чеком\n";
$archive->stopBuffering();
echo $archive['receipt.txt']->getContent(), $archive['notice.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Памятка обновлена вместе с чеком
Буферизация относится к одному объекту/архиву; она не даёт транзакционных гарантий базы данных и не предоставляет rollback. Чтение через тот же объект может видеть подготовленные изменения. При ошибке stopBuffering сборку нельзя выдавать как готовую.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод Phar::stopBuffering() используется совместно с методом Phar::startBuffering(). Phar::startBuffering() может дать значительный прирост производительности при создании, либо модификации phar-архива с большим количеством файлов. Обычно, когда добавляется новый файл, либо изменяется существующий, запускается операция пересоздания phar-архива. С включённой буферизацией архив будет пересоздан один раз в самом конце внесения изменений.
Эта концепция работает аналогично транзакции в базе данных, что позволяет сделать вне необходимые изменения и применить их одновременно, в рамках одной операции. Такое поведение обеспечивает пара методов Phar::startBuffering()/Phar::stopBuffering().
Настройки буферизации индивидуальны для каждого архива.
Включённая буферизация для foo.phar никак не влияет
на режим работы с bar.phar.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
В случае проблем с записью на диск будет выброшено исключение PharException.
Смотрите также
- Phar::startBuffering() - Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
- Phar::isBuffering() - Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::isBufferingPhar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::isBuffering(): boolЗаписать согласованное обновление двух документов. Чек и памятка меняются одной серией. startBuffering откладывает запись на диск, stopBuffering сохраняет подготовленное; это сокращает повторную упаковку контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->startBuffering();
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
$archive['notice.txt'] = "Памятка обновлена вместе с чеком\n";
if (!$archive->isBuffering()) { throw new RuntimeException('Изменения не собраны в буфере'); }
$archive->stopBuffering();
echo $archive['receipt.txt']->getContent(), $archive['notice.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Памятка обновлена вместе с чеком
Буферизация относится к одному объекту/архиву; она не даёт транзакционных гарантий базы данных и не предоставляет rollback. Чтение через тот же объект может видеть подготовленные изменения. При ошибке stopBuffering сборку нельзя выдавать как готовую.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Проверяет, будут ли операции с Phar-архивом сразу записаны на диск или для этого надо вызывать Phar::stopBuffering().
Настройки буферизации индивидуальны для каждого архива.
Включённая буферизация для foo.phar никак не влияет
на режим работы с bar.phar.
Список параметров
Сигнатура функции не содержит параметров.
Смотрите также
- Phar::startBuffering() - Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
- Phar::stopBuffering() - Останавливает буферизацию и записывает все изменения на диск
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getModifiedPhar::getModified — Определить, изменялся phar-архив
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::getModified(): boolЗаписать согласованное обновление двух документов. Чек и памятка меняются одной серией. startBuffering откладывает запись на диск, stopBuffering сохраняет подготовленное; это сокращает повторную упаковку контейнера.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->startBuffering();
$archive['receipt.txt'] = "Заказ 42: исправленная сумма 280 руб.\n";
$archive['notice.txt'] = "Памятка обновлена вместе с чеком\n";
if (!$archive->getModified()) { throw new RuntimeException('Нет подготовленных изменений'); }
$archive->stopBuffering();
echo $archive['receipt.txt']->getContent(), $archive['notice.txt']->getContent();
Ожидаемый результат
Заказ 42: исправленная сумма 280 руб.
Памятка обновлена вместе с чеком
Буферизация относится к одному объекту/архиву; она не даёт транзакционных гарантий базы данных и не предоставляет rollback. Чтение через тот же объект может видеть подготовленные изменения. При ошибке stopBuffering сборку нельзя выдавать как готовую.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот метод используется для определения, изменялось ли что-либо в phar-архиве.
Список параметров
Без параметров.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getPathPhar::getPath — Получить реальный путь к Phar-архиву на диске
(PHP 5 >= 5.3.0, PHP 7, PHP 8) · Phar
public function Phar::getPath(): stringПередать реальный путь отдельному читателю. Путь контейнера нужен, чтобы другой компонент открыл именно этот сохранённый файл. Это путь на диске, а не phar:// URL конкретной записи.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$savedPath = $archive->getPath();
echo 'Файл поставки: ', basename($savedPath), "\n";
$reader = new Phar($savedPath);
echo $reader['receipt.txt']->getContent();
Ожидаемый результат
Файл поставки: orders.phar
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
В PHP Manual у getPath подробное описание отсутствует; здесь показано наблюдаемое использование результата. getPath не заменяет проверки доступа к выбранному пути; произвольное имя из запроса не передаётся конструктору.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Функцию пока не задокументировали; для знакомства доступен только список аргументов.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::isValidPharFilenamePhar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
final public static function Phar::isValidPharFilename(string $filename, bool $executable = true): boolПроверить имя будущего пакета до сборки. У исполняемого пакета имя должно распознаваться как Phar. Проверка не читает файл и не подтверждает, что архив исправен.
<?php
declare(strict_types=1);
$path = __DIR__ . '/receipt.phar';
if (!Phar::isValidPharFilename($path, true)) { throw new RuntimeException('Неподходящее имя'); }
$archive = new Phar($path);
$archive['receipt.txt'] = file_get_contents(__DIR__ . '/input/receipt.txt');
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Второй аргумент true проверяет имя исполняемого формата; false — допустимое имя архива данных. Это проверка синтаксиса имени, а не разрешение использовать путь пользователя.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$filename, bool $executable = true): boolПроверяет, что заданное имя файла является корректным именем phar-архива. Можно использовать для проверки имени файла до момента его непосредственного создания, чтобы избежать нежелательных исключений.
Список параметров
filename-
Имя или полный путь до файла, который ещё не создан
executable-
Этот параметр определяет, должен ли файл опознаваться как запускаемый phar-архив, или как незапускаемый архив с данными
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::unlinkArchivePhar::unlinkArchive — Удаляет архив из памяти и с диска
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::unlinkArchive(string $filename): trueУдалить только отработанный учебный пакет. После выдачи чека нужно убрать собственный orders.phar вместе с его регистрацией в памяти. Сначала освобождаем все объекты/потоки этого архива.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
echo $archive['receipt.txt']->getContent();
unset($archive);
Phar::unlinkArchive($path);
if (file_exists($path)) { throw new RuntimeException('Контейнер не удалён'); }
echo "orders.phar удалён; исходный чек на диске сохранён:\n", file_get_contents(__DIR__ . '/input/receipt.txt');
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
orders.phar удалён; исходный чек на диске сохранён:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Здесь путь создан самим примером. С открытым PharFileInfo/потоком/Phar или из самого выполняемого архива удаление запрещено; постоянный phar.cache_list тоже препятствует удалению. Обычный unlink не очищает регистрацию Phar в памяти.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Метод удаляет архив из памяти и с диска.
Список параметров
filename-
Путь к архиву в файловой системе.
Ошибки
Метод выбрасывает исключение PharException, если в коде остаются открытые файловые указатели на phar-архив или объекты Phar, PharData, PharFileInfo, которые ссылаются на этот архив.
Смотрите также
- Phar::delete() - Удаляет файл в phar-архиве
- Phar::offsetUnset() - Удалить файл из phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::setAliasPhar::setAlias — Установить псевдоним для Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.1) · Phar
public function Phar::setAlias(string $alias): trueИспользовать короткое имя внутри приложения. Псевдоним order-package.phar позволяет читать чек, не повторяя абсолютный путь контейнера. Физический orders.phar от этого не переименовывается.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setAlias('order-package.phar');
$alias = $archive->getAlias();
if ($alias === null) { throw new RuntimeException('Псевдоним не установлен'); }
echo 'Чтение через ', $alias, ":\n";
echo file_get_contents('phar://' . $alias . '/receipt.txt');
Ожидаемый результат
Чтение через order-package.phar:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
loadPhar регистрирует внешний контейнер без запуска его PHP-загрузчика. Нельзя незаметно заменить уже заданный явный alias; конфликт имён может вызвать PharException. Для PharData метод setAlias всегда отклоняется.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Устанавливает псевдоним для Phar-архива и записывает его как постоянный
псевдоним для этого архива. Псевдоним можно использовать внутри phar-архива для
уверенности в том, что доступ через потоковую обёртку phar для
доступа к внутренним файлам будет работать всегда, независимо от местоположения
phar-архива на файловой системе. Другой альтернативой является надежда на
перехват include или использование
Phar::interceptFileFuncs() совместно с относительными путями.
Список параметров
alias-
Короткое имя, которое можно будет использовать с доступом через потоковую обёртку
phar.
Ошибки
Выбрасывает исключение UnexpectedValueException, если доступ запрещён и PharException, если псевдоним уже используется, или возникли проблемы с записью на диск.
Список изменений
| Версия | Описание |
|---|---|
| 8.4.0 | Метод Phar::setAlias() теперь возвращает предварительное значение true. |
Смотрите также
- Phar::__construct() - Создаёт объект Phar-архива
- Phar::interceptFileFuncs() - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getAliasPhar::getAlias — Получить псевдоним для Phar
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.1) · Phar
public function Phar::getAlias(): ?stringИспользовать короткое имя внутри приложения. Псевдоним order-package.phar позволяет читать чек, не повторяя абсолютный путь контейнера. Физический orders.phar от этого не переименовывается.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setAlias('order-package.phar');
$alias = $archive->getAlias();
if ($alias === null) { throw new RuntimeException('Псевдоним не установлен'); }
echo 'Чтение через ', $alias, ":\n";
echo file_get_contents('phar://' . $alias . '/receipt.txt');
Ожидаемый результат
Чтение через order-package.phar:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
loadPhar регистрирует внешний контейнер без запуска его PHP-загрузчика. Нельзя незаметно заменить уже заданный явный alias; конфликт имён может вызвать PharException. Для PharData метод setAlias всегда отклоняется.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Функцию пока не задокументировали; для знакомства доступен только список аргументов.
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает псевдоним или null в случае его отсутствия.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::loadPharPhar::loadPhar — Загрузить phar-архив с псевдонимом
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
final public static function Phar::loadPhar(string $filename, ?string $alias = null): boolИспользовать короткое имя внутри приложения. Псевдоним order-package.phar позволяет читать чек, не повторяя абсолютный путь контейнера. Физический orders.phar от этого не переименовывается.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
Phar::loadPhar($path, 'order-package.phar');
$alias = 'order-package.phar';
echo 'Чтение через ', $alias, ":\n";
echo file_get_contents('phar://' . $alias . '/receipt.txt');
Ожидаемый результат
Чтение через order-package.phar:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
loadPhar регистрирует внешний контейнер без запуска его PHP-загрузчика. Нельзя незаметно заменить уже заданный явный alias; конфликт имён может вызвать PharException. Для PharData метод setAlias всегда отклоняется.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Может использоваться для загрузки внешнего Phar-архива. То, что для phar-архива назначается псевдоним, позволяет в дальнейшем использовать более короткие ссылки для доступа к нему или же для загрузки архивов Phar, содержащих только данные и не предназначенных для выполнения.
Список параметров
filename-
Путь к загружаемому phar-архиву
alias-
Псевдоним для доступа к архиву. Обратите внимание, что многие phar-архивы имеют свой явно заданный псевдоним и, при задании нового псевдонима, будет выброшено исключение PharException.
Возвращаемые значения
Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.
Ошибки
Если задан параметр с псевдонимом, а загружаемый архив уже имеет псевдоним, то будет выброшено исключение PharException
Смотрите также
- Phar::mapPhar() - Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::setMetadataPhar::setMetadata — Установить метаданные phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::setMetadata(mixed $metadata): voidСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
if (!$archive->hasMetadata()) { throw new RuntimeException('Нет карточки поставки'); }
$metadata = $archive->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['recipient'] ?? null)) { throw new RuntimeException('Некорректная карточка'); }
$recipient = 'Получатель: ' . $metadata['recipient'];
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель: Анна
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный Phar.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Функция Phar::setMetadata() используется для сохранения данных, характеризующих phar-архив в целом. PharFileInfo::setMetadata() используется для установки метаданных для конкретного файла. Если метаданных будет много, то это может снизить скорость загрузки phar-архива.
Метаданные можно использовать, например, для указания, какой файл должен исполняться при загрузке, или для указания местоположения манифеста, типа package.xml для модуля » PEAR. В общем, любые полезные в контексте phar-архива данные.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Смотрите также
- Phar::getMetadata() - Извлечь метаданные phar-архива
- Phar::delMetadata() - Удаляет глобальные метаданные в phar-архиве
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getMetadataPhar::getMetadata — Извлечь метаданные phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::getMetadata(array $unserializeOptions = []): mixedСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
if (!$archive->hasMetadata()) { throw new RuntimeException('Нет карточки поставки'); }
$metadata = $archive->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['recipient'] ?? null)) { throw new RuntimeException('Некорректная карточка'); }
$recipient = 'Получатель: ' . $metadata['recipient'];
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель: Анна
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный Phar.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает метаданные phar-архива. Метаданными может быть любая переменная PHP, которая может быть сериализована.
Доступ к метаданным вызовет десериализацию, которая может привести
к выполнению произвольного PHP-кода. Не используйте этот метод
для недоверенных phar-архивов или настройте параметр unserializeOptions
безопасным образом.
Список параметров
Без параметров.
Возвращаемые значения
Любое значение PHP, которое может быть сериализовано и хранится как метаданные для архива Phar,
либо null, если метаданные отсутствуют.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
Добавлен параметр unserializeOptions.
|
Смотрите также
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::delMetadata() - Удаляет глобальные метаданные в phar-архиве
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::hasMetadataPhar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
public function Phar::hasMetadata(): boolСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
if (!$archive->hasMetadata()) { throw new RuntimeException('Нет карточки поставки'); }
$metadata = $archive->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['recipient'] ?? null)) { throw new RuntimeException('Некорректная карточка'); }
$recipient = 'Получатель: ' . $metadata['recipient'];
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель: Анна
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный Phar.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Проверяет, содержит ли phar-архив глобальные метаданные.
Список параметров
Без параметров.
Смотрите также
- Phar::getMetadata() - Извлечь метаданные phar-архива
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::delMetadata() - Удаляет глобальные метаданные в phar-архиве
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::delMetadataPhar::delMetadata — Удаляет глобальные метаданные в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0) · Phar
public function Phar::delMetadata(): trueСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
$archive->delMetadata();
$recipient = $archive->hasMetadata() ? 'Указан получатель' : 'Получатель не указан';
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель не указан
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный Phar.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод удаляет глобальные метаданные в phar-архиве.
Список параметров
Ошибки
Метод выбрасывает исключение PharException, если при сохранении изменений на диск возникла ошибка.
Смотрите также
- Phar::getMetadata() - Извлечь метаданные phar-архива
- Phar::setMetadata() - Установить метаданные phar-архива
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::setMetadataPharData::setMetadata — Установить метаданные phar-архива
(No version information available, might only be in Git) · Phar
public function PharData::setMetadata(mixed $metadata): voidСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
if (!$archive->hasMetadata()) { throw new RuntimeException('Нет карточки поставки'); }
$metadata = $archive->getMetadata(['allowed_classes' => false, 'max_depth' => 8]);
if (!is_array($metadata) || !is_string($metadata['recipient'] ?? null)) { throw new RuntimeException('Некорректная карточка'); }
$recipient = 'Получатель: ' . $metadata['recipient'];
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель: Анна
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный ZIP.
Перед чтением контракта. Для обычного неисполняемого PharData ограничение phar.readonly не блокирует запись данных. Общую оговорку старого текста ниже следует читать с учётом этого отличия от Phar. Полный проект TAR.GZ действительно выполняется при phar.readonly=1.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Функция Phar::setMetadata() используется для сохранения данных, характеризующих phar-архив в целом. PharFileInfo::setMetadata() используется для установки метаданных для конкретного файла. Если метаданных будет много, то это может снизить скорость загрузки phar-архива.
Метаданные можно использовать, например, для указания, какой файл должен исполняться при загрузке, или для указания местоположения манифеста, типа package.xml для модуля » PEAR. В общем, любые полезные в контексте phar-архива данные.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Смотрите также
- Phar::getMetadata() - Извлечь метаданные phar-архива
- Phar::delMetadata() - Удаляет глобальные метаданные в phar-архиве
- Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::delMetadataPharData::delMetadata — Удаляет глобальные метаданные zip-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::delMetadata(): trueСохранить получателя отдельно от чека. Карточка всей поставки содержит номер заказа и имя получателя. Метаданные не изменяют строки receipt.txt и не должны хранить ненужные тяжёлые объекты.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setMetadata(['order' => 42, 'recipient' => 'Анна']);
$archive->delMetadata();
$recipient = $archive->hasMetadata() ? 'Указан получатель' : 'Получатель не указан';
echo $recipient, "\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Получатель не указан
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Уточнение неполного описания параметров PHP Manual: getMetadata принимает unserializeOptions с PHP8.0. Мы передаём allowed_classes=false и max_depth=8, затем проверяем типы полей. Для новой схемы обмена простая JSON-запись часто понятнее PHP-сериализации. TAR/ZIP и конкретный формат ограничивают переносимость метаданных; здесь используется собственный ZIP.
Перед чтением контракта. Для обычного неисполняемого PharData ограничение phar.readonly не блокирует запись данных. Общую оговорку старого текста ниже следует читать с учётом этого отличия от Phar. Полный проект TAR.GZ действительно выполняется при phar.readonly=1.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод удаляет глобальные метаданные zip-архива.
Список параметров
Ошибки
Метод выбрасывает исключение PharException, если возникла ошибка при сохранении изменений на диск.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::setSignatureAlgorithmPhar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.1.0) · Phar
public function Phar::setSignatureAlgorithm(int $algo, ?string $privateKey = null): voidЗаписать контроль целостности поставки. Получателю нужен документ и отдельно информация о выбранной проверке целостности. Сохраняем реальное значение hash и hash_type в signature.json; на экран выводим алгоритм и сам чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setSignatureAlgorithm(Phar::SHA256);
$signature = $archive->getSignature();
if ($signature === false) { throw new RuntimeException('Нет подписи целостности'); }
file_put_contents(__DIR__ . '/signature.json', json_encode($signature, JSON_THROW_ON_ERROR));
echo 'Алгоритм: ', $signature['hash_type'], "; проверочное значение сохранено в signature.json\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Алгоритм: SHA-256; проверочное значение сохранено в signature.json
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Хеш зависит от всех байтов и метаданных контейнера, поэтому его значение не зашито в вывод. SHA256 здесь проверяет целостность, а не удостоверяет автора: тот, кто меняет архив, может пересчитать хеш. Подпись OpenSSL требует доверенного открытого ключа и отдельного управления ключами. Полный файл signature.json остаётся рядом с архивом.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Устанавливает алгоритм подписания phar-архива и применяет его.
Доступны следующие алгоритмы подписания: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 и Phar::OPENSSL.
Обратите внимание, что для всех исполняемых phar-архивов подпись создаётся
автоматически, с использованием по умолчанию SHA1.
Архивы с данными на основе tar или zip
(созданные с помощью класса PharData) должны иметь
явно созданную с помощью Phar::setSignatureAlgorithm() подпись.
Список параметров
algo-
Одна из констант:
Phar::MD5,Phar::SHA1,Phar::SHA256,Phar::SHA512илиPhar::OPENSSL privateKey-
Секретный ключ OpenSSL, извлечённый из сертификата, либо файл с ключом OpenSSL:
Подробности об именовании и размещении файла открытого ключа смотрите в разделе Введение в phar.<?php $private = openssl_get_privatekey(file_get_contents('private.pem')); $pkey = ''; openssl_pkey_export($private, $pkey); $p->setSignatureAlgorithm(Phar::OPENSSL, $pkey); ?>
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбрасывает исключение UnexpectedValueException при любых ошибках, кроме ошибок записи на диск. При ошибках записи на диск выбрасывает исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
privateKey теперь допускает значение null.
|
Смотрите также
- Phar::getSupportedSignatures() - Получить массив поддерживаемых алгоритмов подписи архива
- Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getSignaturePhar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::getSignature(): array|falseЗаписать контроль целостности поставки. Получателю нужен документ и отдельно информация о выбранной проверке целостности. Сохраняем реальное значение hash и hash_type в signature.json; на экран выводим алгоритм и сам чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setSignatureAlgorithm(Phar::SHA256);
$signature = $archive->getSignature();
if ($signature === false) { throw new RuntimeException('Нет подписи целостности'); }
file_put_contents(__DIR__ . '/signature.json', json_encode($signature, JSON_THROW_ON_ERROR));
echo 'Алгоритм: ', $signature['hash_type'], "; проверочное значение сохранено в signature.json\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Алгоритм: SHA-256; проверочное значение сохранено в signature.json
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Хеш зависит от всех байтов и метаданных контейнера, поэтому его значение не зашито в вывод. SHA256 здесь проверяет целостность, а не удостоверяет автора: тот, кто меняет архив, может пересчитать хеш. Подпись OpenSSL требует доверенного открытого ключа и отдельного управления ключами. Полный файл signature.json остаётся рядом с архивом.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает проверочную подпись phar-архива в виде строки шестнадцатеричных цифр.
Список параметров
Возвращаемые значения
Массив, содержащий цифровую подпись открытого архива по ключу hash,
и MD5, SHA-1, SHA-256,
SHA-512 или OpenSSL по ключу
hash_type. Подпись - это хеш, вычисленный от содержимого
архива, которую можно использовать для проверки его целостности.
Корректная подпись требуется для всех запускаемых phar-архивов, если разрешена
INI-переменная phar.require_hash.
Если сигнатуры нет, функция возвращает false.
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getSupportedSignaturesPhar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.1.0) · Phar
final public static function Phar::getSupportedSignatures(): arrayЗаписать контроль целостности поставки. Получателю нужен документ и отдельно информация о выбранной проверке целостности. Сохраняем реальное значение hash и hash_type в signature.json; на экран выводим алгоритм и сам чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.phar и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
if (!in_array('SHA-256', Phar::getSupportedSignatures(), true)) { throw new RuntimeException('Нужна поддержка SHA-256'); }
$archive->setSignatureAlgorithm(Phar::SHA256);
$signature = $archive->getSignature();
if ($signature === false) { throw new RuntimeException('Нет подписи целостности'); }
file_put_contents(__DIR__ . '/signature.json', json_encode($signature, JSON_THROW_ON_ERROR));
echo 'Алгоритм: ', $signature['hash_type'], "; проверочное значение сохранено в signature.json\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Алгоритм: SHA-256; проверочное значение сохранено в signature.json
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Хеш зависит от всех байтов и метаданных контейнера, поэтому его значение не зашито в вывод. SHA256 здесь проверяет целостность, а не удостоверяет автора: тот, кто меняет архив, может пересчитать хеш. Подпись OpenSSL требует доверенного открытого ключа и отдельного управления ключами. Полный файл signature.json остаётся рядом с архивом.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает массив поддерживаемых алгоритмов подписи архива
Список параметров
Без параметров.
Возвращаемые значения
Возвращает массив примерно такого содержания: MD5, SHA-1,
SHA-256, SHA-512, OpenSSL.
Смотрите также
- Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
- Phar::setSignatureAlgorithm() - Установить алгоритм подписания phar-архива и применение его
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::setSignatureAlgorithmPharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
(No version information available, might only be in Git) · Phar
public function PharData::setSignatureAlgorithm(int $algo, ?string $privateKey = null): voidЗаписать контроль целостности поставки. Получателю нужен документ и отдельно информация о выбранной проверке целостности. Сохраняем реальное значение hash и hash_type в signature.json; на экран выводим алгоритм и сам чек.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
$archive->setSignatureAlgorithm(Phar::SHA256);
$signature = $archive->getSignature();
if ($signature === false) { throw new RuntimeException('Нет подписи целостности'); }
file_put_contents(__DIR__ . '/signature.json', json_encode($signature, JSON_THROW_ON_ERROR));
echo 'Алгоритм: ', $signature['hash_type'], "; проверочное значение сохранено в signature.json\n";
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Алгоритм: SHA-256; проверочное значение сохранено в signature.json
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Хеш зависит от всех байтов и метаданных контейнера, поэтому его значение не зашито в вывод. SHA256 здесь проверяет целостность, а не удостоверяет автора: тот, кто меняет архив, может пересчитать хеш. Подпись OpenSSL требует доверенного открытого ключа и отдельного управления ключами. Полный файл signature.json остаётся рядом с архивом.
Перед чтением контракта. Для обычного неисполняемого PharData ограничение phar.readonly не блокирует запись данных. Общую оговорку старого текста ниже следует читать с учётом этого отличия от Phar. Полный проект TAR.GZ действительно выполняется при phar.readonly=1.
Перед чтением контракта. Проверенный PHP 8.5.11 сохраняет SHA256-подпись собственного ZIP через PharData. Историческая фраза ниже об обязательном отказе для TAR/ZIP не описывает этот рабочий случай. Поддержка формата и допустимые алгоритмы проверяются для конкретного контейнера; хеш без доверенного ключа не удостоверяет отправителя.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Устанавливает алгоритм подписания phar-архива и применяет его.
Доступны следующие алгоритмы подписания: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 и Phar::OPENSSL.
(pgp пока не поддерживается, вместо него используется SHA-1).
Список параметров
algo-
Одна из констант:
Phar::MD5,Phar::SHA1,Phar::SHA256,Phar::SHA512илиPhar::OPENSSL
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбрасывает исключение UnexpectedValueException для большинства ошибок. Для архивов на основе zip или tar выбрасывает исключение BadMethodCallException. При ошибках записи на диск выбрасывает исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
privateKey теперь допускает значение null.
|
Смотрите также
- Phar::getSupportedSignatures() - Получить массив поддерживаемых алгоритмов подписи архива
- Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::setAliasPharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::setAlias(string $alias): boolПолучить понятный отказ для архива данных. Неисполняемому контейнеру данных нельзя назначить загрузчик или псевдоним исполняемого Phar. Этот метод присутствует в интерфейсе, но всегда бросает исключение.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
try { $archive->setAlias('orders.phar'); }
catch (UnexpectedValueException | PharException $error) { echo "Это архив данных; запустить его как приложение нельзя\n"; }
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Это архив данных; запустить его как приложение нельзя
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Формальная возвращаемая сигнатура не означает успешный путь: фактически вызов отклоняется. PHP8.5.11 для собственного ZIP бросает UnexpectedValueException; краткая официальная страница называет PharException, поэтому пример учитывает оба документированных/наблюдаемых варианта. Для осознанного перехода есть convertToExecutable и собственный проверенный стартовый код.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Незапускаемые tar/zip-архивы не могут иметь псевдонима, так что этот метод просто выбрасывает исключение.
Список параметров
alias-
Параметр игнорируется.
Возвращаемые значения
Ошибки
Выбрасывает исключение PharException
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::setDefaultStubPharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::setDefaultStub(?string $index = null, ?string $webIndex = null): boolПолучить понятный отказ для архива данных. Неисполняемому контейнеру данных нельзя назначить загрузчик или псевдоним исполняемого Phar. Этот метод присутствует в интерфейсе, но всегда бросает исключение.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
try { $archive->setDefaultStub('index.php'); }
catch (UnexpectedValueException | PharException $error) { echo "Это архив данных; запустить его как приложение нельзя\n"; }
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Это архив данных; запустить его как приложение нельзя
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Формальная возвращаемая сигнатура не означает успешный путь: фактически вызов отклоняется. PHP8.5.11 для собственного ZIP бросает UnexpectedValueException; краткая официальная страница называет PharException, поэтому пример учитывает оба документированных/наблюдаемых варианта. Для осознанного перехода есть convertToExecutable и собственный проверенный стартовый код.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Незапускаемые tar/zip-архивы не могут иметь заглушку, так что этот метод просто выбрасывает исключение.
Список параметров
index-
Относительный путь в phar-архиве для запуска при доступе из командной строки
webIndex-
Относительный путь в phar-архиве для запуска при доступе через браузер
Возвращаемые значения
Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.
Ошибки
Выбрасывает исключение PharException
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
webIndex теперь допускает значение null.
|
Смотрите также
- Phar::setDefaultStub() - Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
PharData::setStubPharData::setStub — Функция-пустышка: метод setStub допустим только для объектов Phar, но не PharData
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function PharData::setStub(resource|string $stub, int $length = -1): trueПолучить понятный отказ для архива данных. Неисполняемому контейнеру данных нельзя назначить загрузчик или псевдоним исполняемого Phar. Этот метод присутствует в интерфейсе, но всегда бросает исключение.
В архиве примера есть оба input-файла и bootstrap.php. Он создаёт orders.zip и помещает объект в $archive. Полный разбор исходников. Запуск: php -d phar.readonly=0 example.php в новой папке.
<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
try { $archive->setStub('<?php __HALT_COMPILER();'); }
catch (UnexpectedValueException | PharException $error) { echo "Это архив данных; запустить его как приложение нельзя\n"; }
echo $archive['receipt.txt']->getContent();
Ожидаемый результат
Это архив данных; запустить его как приложение нельзя
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Формальная возвращаемая сигнатура не означает успешный путь: фактически вызов отклоняется. PHP8.5.11 для собственного ZIP бросает UnexpectedValueException; краткая официальная страница называет PharException, поэтому пример учитывает оба документированных/наблюдаемых варианта. Для осознанного перехода есть convertToExecutable и собственный проверенный стартовый код.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Неисполняемым tar- и zip-архивам нельзя содержать загрузочную заглушку, поэтому метод только выбрасывает исключение.
Список параметров
stub-
Формально, строка или дескриптор открытого потока; при включении архива код заглушки выполняется как начальный загрузчик. Параметр игнорируется.
length-
Формально, количество байтов, которое требуется прочитать из потока, если в аргументе
stubпередали ресурс. Параметр игнорируется.
Ошибки
При вызове метод выбрасывает исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.4.0 |
Вместо общего логического типа bool теперь возвращается конкретный тип true.
|
Смотрите также
- Phar::setStub() - Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::setStubPhar::setStub — Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::setStub(resource|string $stub, int $length = -1): trueЗапустить программу, которая выдаёт чек. Нужно собрать собственную программу в один app.phar: загрузчик задаёт, какой PHP-файл внутри начинает работу.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Метод устанавливает заглушку — начальный загрузчик — в Phar-архив: в новый архив добавляет, а в текущем — заменяет.
Загрузочная заглушка срабатывает при каждом включении Phar-архива:
<?php
include 'myphar.phar';php myphar.phar
При включении файла через потоковую обёртку phar
загрузчик не запускается:
<?php
include 'phar://myphar.phar/somefile.php';Список параметров
stub-
Строка или дескриптор открытого потока; при включении архива код заглушки выполняется как начальный загрузчик.
length-
Количество байтов, которое требуется прочитать из потока; параметр учитывается, только если в аргументе
stubпередали ресурс.ВниманиеС PHP 8.3.0 вызов метода с ресурсом (resource) в первом аргументе УСТАРЕЛ, поэтому вместо передачи ресурса и аргумента
lengthтеперь вызывают:$phar->setStub(stream_get_contents($resource)).
Ошибки
При вызове метода с включённой в файле php.ini директивой phar.readonly выбрасывается исключение UnexpectedValueException. При ошибке сброса изменений на диск выбрасывается исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.4.0 |
Вместо общего логического типа bool теперь возвращается конкретный тип true.
|
| 8.3.0 |
Вызов метода Phar::setStub() с ресурсом (resource) в первом аргументе УСТАРЕЛ.
Вместо передачи ресурса и аргумента length
теперь вызывают: $phar->setStub(stream_get_contents($resource));.
|
Смотрите также
- Phar::getStub() - Получить загрузчик PHP или загрузчик заглушки Phar-архива
- Phar::createDefaultStub() - Создать заглушку в формате phar-архива
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::getStubPhar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
public function Phar::getStub(): stringЗапустить программу, которая выдаёт чек. Перед выпуском хотим сохранить именно тот стартовый код, который сейчас записан в контейнере, и проверить его результат.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
file_put_contents(__DIR__ . '/saved-stub.php', $archive->getStub());
echo "Фактический загрузчик сохранён в saved-stub.php; результат его работы:\n";
require $path;
Ожидаемый результат
Фактический загрузчик сохранён в saved-stub.php; результат его работы:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Phar-архивы содержат начальную загрузку или заглушку (stub), написанную на
PHP, который запускается при запуске архива, когда его подключают через include:
<?php
include 'myphar.phar';
?>php myphar.phar
Список параметров
Сигнатура функции не содержит параметров.
Возвращаемые значения
Возвращает строку с содержанием начального загрузчика (заглушки) текущего Phar-архива.
Ошибки
Выбрасывает исключение RuntimeException, если по каким-либо причинам не может получить текст загрузчика.
Смотрите также
- Phar::setStub() - Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
- Phar::createDefaultStub() - Создать заглушку в формате phar-архива
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::createDefaultStubPhar::createDefaultStub — Создать заглушку в формате phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::createDefaultStub(?string $index = null, ?string $webIndex = null): stringЗапустить программу, которая выдаёт чек. Вместо собственного загрузчика получаем стандартный код, который запускает main.php; строку ещё необходимо установить через setStub.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = Phar::createDefaultStub('main.php');
$archive->setStub($stub);
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
$index = null, ?string $webIndex = null): stringЭтот метод создаёт код заглушку (stub) в специфичном для phar-архива формате и не предназначенный для использования с файловыми архивами на основе tar или zip.
Phar-архивы содержат загрузчик (stub), написанный на
PHP, который запускается при запуске архива, когда его подключают через include:
<?php
include 'myphar.phar';
?>php myphar.phar
Этот метод предоставляет простой способ для создания заглушку, который будет отрабатывать при запуске phar-архива. Кроме того, можно указывать разные файлы для запуска phar-архива через веб-сервер и через командную строку. Заглушка также вызывает Phar::interceptFileFuncs() для простого создания приложений PHP с доступом к файловой системе. Если модуль phar отсутствует, то заглушка распакует phar-архив во временную директорию и запустит приложение оттуда. Функция завершения работы удалит все временные файлы.
Список параметров
index-
Относительный путь в phar-архиве для запуска при доступе из командной строки
webIndex-
Относительный путь в phar-архиве для запуска при доступе через браузер
Возвращаемые значения
Возвращает текст с кодом заглушку, который позволит Phar-архиву запускаться независимо от того, подключён ли модуль Phar или нет.
Ошибки
Выбросит исключение UnexpectedValueException, если любой из параметров будет длиннее 400 байт.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
index и webIndex теперь допускают значение null.
|
Смотрите также
- Phar::setStub() - Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
- Phar::getStub() - Получить загрузчик PHP или загрузчик заглушки Phar-архива
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::setDefaultStubPhar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
public function Phar::setDefaultStub(?string $index = null, ?string $webIndex = null): trueЗапустить программу, которая выдаёт чек. Один метод создаёт и устанавливает стандартный загрузчик с точкой входа main.php.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$archive->setDefaultStub('main.php');
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Замечание:
Для корректной работы метода с объектами Phar потребуется установить для директивы
phar.readonlyв файле php.ini значение0, иначе метод выбросит исключение PharException.
Этот метод комбинирует функциональность двух других методов, Phar::createDefaultStub() и Phar::setStub().
Список параметров
index-
Относительный путь в phar-архиве для запуска при доступе из командной строки
webIndex-
Относительный путь в phar-архиве для запуска при доступе из веб-браузера
Ошибки
Будет выброшено исключение UnexpectedValueException, если phar.readonly разрешено в php.ini. В случае проблем с записью на диск будет выброшено исключение PharException.
Список изменений
| Версия | Описание |
|---|---|
| 8.4.0 | Метод Phar::setDefaultStub() теперь возвращает предварительное значение true. |
| 8.0.0 |
webIndex теперь допускает значение null.
|
Смотрите также
- Phar::setStub() - Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
- Phar::createDefaultStub() - Создать заглушку в формате phar-архива
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::mapPharPhar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0) · Phar
final public static function Phar::mapPhar(?string $alias = null, int $offset = 0): boolЗапустить программу, которая выдаёт чек. Во время старта собственный stub регистрирует текущий контейнер, после чего require может обратиться к внутреннему main.php.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Этот статический метод можно использовать только в заглушке загрузчика Phar-архива в целях его инициализации, когда он запущен напрямую, либо включён в другой скрипт.
Список параметров
alias-
Псевдоним можно использовать в обёртках
phar://, ссылаясь на этот архив, вместо использования полного пути. offset-
Неиспользуемая переменная. Существует только для совместимости с PEAR-пакетом PHP_Archive.
Возвращаемые значения
Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.
Ошибки
Выбрасывается исключение PharException, если вызывается из скрипта, в котором не обнаружено токена __HALT_COMPILER();, либо если файл недоступен для чтения.
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents(__DIR__ . '/receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::interceptFileFuncsPhar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::interceptFileFuncs(): voidЗапустить программу, которая выдаёт чек. Переносим маленькую программу с относительным file_get_contents("receipt.txt") внутрь архива, сохранив чтение приложенного чека.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub. Перехват действует на относительные файловые обращения, сделанные из архива. Абсолютный путь остаётся обращением к внешнему диску; новые приложения могут использовать явный phar:// путь вместо глобального перехвата.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Указывает phar перехватывать fopen(), readfile(), file_get_contents(), opendir() и все stat-функции. Если какая-либо из этих функций будет вызвана из phar-архива с относительным путём, то вызов будет модифицирован для доступа к содержимому архива. В случае с абсолютными путями будут работать штатные функции доступа к файловой системе.
Эта функция позволяет писать приложения работающие не привязанные к жёсткому диску.
Список параметров
No parameters.
Возвращаемые значения
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$text = file_get_contents('receipt.txt');
if ($text === false) { throw new RuntimeException('Нет чека в приложении'); }
echo $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
Phar::interceptFileFuncs();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::mountPhar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::mount(string $pharPath, string $externalPath): voidЗапустить программу, которая выдаёт чек. Код и чек остаются в app.phar, а локальная настройка выдачи хранится рядом и подключается под виртуальным именем.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
require $path;
Ожидаемый результат
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Локальная настройка: выдача после 10:00.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub. Виртуальный runtime-note.txt читает собственный внешний external-note.txt. Файл не копируется в контейнер и должен оставаться доступен; нельзя монтировать произвольный путь из запроса.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Очень похоже на концепцию файловой системы unix по монтированию внешнего устройства в существующее дерево директорий. Phar::mount() позволяет ссылаться на внешние файлы и директории, как будто они находятся внутри архива. Это позволяет повысить уровень абстракции обращаясь ко внешним конфигурационным файлам так, как будто они являются частью архива.
Список параметров
pharPath-
Внутренний путь в архиве, по которому необходимо примонтировать внешний путь. Это должен быть несуществующий относительный путь внутри архива.
externalPath-
Путь или URL внешнего файла или директории
Возвращаемые значения
Ничего не возвращает. В случае возникновения ошибки выбрасывает исключение PharException.
Ошибки
Выбрасывает исключение PharException при возникновении ошибок.
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
Phar::mount('runtime-note.txt', dirname(Phar::running(false)) . '/external-note.txt');
echo file_get_contents(__DIR__ . '/receipt.txt');
echo file_get_contents(__DIR__ . '/runtime-note.txt');
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::runningPhar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::running(bool $returnPhar = true): stringЗапустить программу, которая выдаёт чек. Программа внутри архива должна записать delivery.txt рядом с внешним app.phar, а не попытаться изменить собственное содержимое.
В приложенном source/stub.php __FILE__ обозначает сам app.phar. __HALT_COMPILER(); завершает PHP-загрузчик: следующие байты являются структурой архива. В source/main.php __DIR__ уже относится к внутренней папке phar://. Запуск сборки и демонстрации: php -d phar.readonly=0 example.php; затем готовое приложение запускается как php app.phar.
<?php
declare(strict_types=1);
$path = __DIR__ . '/app.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка для сборки'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/main.php', 'main.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
require $path;
Ожидаемый результат
Работает app.phar; delivery.txt сохранён рядом с контейнером:
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
Выполняется только код, приложенный к этому собственному проекту. require app.phar запускает загрузчик; require phar://.../main.php напрямую загружал бы внутренний файл без запуска stub. Внутри main.php Phar::running(false) даёт путь контейнера на диске. В самом stub running возвращает пустую строку: там используют __FILE__. По умолчанию running(true) возвращает phar:// URL.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Возвращает полный путь запущенного phar-архива. Используется для того же, для
чего используется константа __FILE__ и работает только внутри
запущенного phar-архива.
При запуске Phar::running() из загрузчика результат будет
"". Внутри загрузчика используйте
константу __FILE__.
Список параметров
Возвращаемые значения
Вернёт путь, если он корректен, либо пустую строку.
source/main.php — полный исполняемый файл, приложенный к архиву примера:
<?php
$container = Phar::running(false);
$text = file_get_contents(__DIR__ . '/receipt.txt');
file_put_contents(dirname($container) . '/delivery.txt', $text);
echo 'Работает ', basename($container), "; delivery.txt сохранён рядом с контейнером:\n", $text;
source/stub.php — собственный загрузчик для вызовов setStub/mapPhar:
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/main.php';
__HALT_COMPILER();Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::webPharPhar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::webPhar( ?string $alias = null, ?string $index = null, ?string $fileNotFoundScript = null, array $mimeTypes = [], ?callable $rewrite = null): voidВыдать документ из работающего веб-пакета. Один web.phar содержит PHP-страницу, текст чека и обработчик отсутствующего документа. webPhar выбирает запись, исполняет PHP или отдаёт текст с заданным MIME.
Пять параметров webPhar: псевдоним, стартовый файл, PHP-обработчик отсутствия, дополнительные MIME и необязательный callback изменения пути. Здесь callback не нужен. header задаёт HTTP-заголовок до тела; http_response_code(404) задаёт статус отказа. Полные файлы перечислены после контракта и уже вложены в ZIP.
<?php
declare(strict_types=1);
$path = __DIR__ . '/web.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/receipt.php', 'receipt.php');
$archive->addFile(__DIR__ . '/source/missing.php', 'missing.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
echo "web.phar собран\n";
Ожидаемый результат
GET /web.phar/receipt.php → 200; text/plain; charset=UTF-8
Личная выдача заказа
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
GET /web.phar/receipt.txt → 200; text/plain; charset=UTF-8
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
GET /web.phar/absent.txt → 404; text/plain; charset=UTF-8
Документ не найден
Проверка использует только 127.0.0.1. PHP-заголовок выставляет сама receipt.php; статический txt получает MIME из таблицы webPhar; missing.php сам выставляет404. mungServer действует только вместе с webPhar и только для исполняемой PHP-записи. Дата/порт/полный путь зависят от запуска, поэтому проверяются смысловые заголовки и точные тела, а все реальные заголовки сохраняются в http-observed.json.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
?string
$alias = null,?string
$index = null,?string
$fileNotFoundScript = null,array
$mimeTypes = [],?callable
$rewrite = null): void
Phar::webPhar() служит Phar::mapPhar() для веб-архивов phar. Метод анализирует $_SERVER['REQUEST_URI'] и направляет запрос из браузера во внутренний файл в phar-архиве. Он имитирует веб-сервер, направляет запросы к нужному файлу, отображает правильные заголовки и анализирует файлы PHP по мере необходимости. В сочетании с Phar::mungServer() и Phar::interceptFileFuncs(), любое веб-приложение можно использовать без изменений из phar-архива.
Phar::webPhar() должен вызываться только из заглушки (stub) phar-архива (о том, что такое заглушка и как с ним работать, читайте тут).
Список параметров
alias-
Псевдоним для использования в обёртках
phar://. index-
Местоположение в phar-архиве индексного файла.
fileNotFoundScript-
Местоположение скрипта, отвечающего за обработку ошибки HTTP 404. Скрипт должен возвращать корректные заголовки для этой ошибки.
mimeTypes-
Массив сопоставления расширений файлов типам MIME. Если достаточно сопоставления по умолчанию, то передайте сюда пустой массив. По умолчанию используются такие сопоставления:
<?php $mimes = array( 'phps' => Phar::PHPS, // передаётся в highlight_file() 'c' => 'text/plain', 'cc' => 'text/plain', 'cpp' => 'text/plain', 'c++' => 'text/plain', 'dtd' => 'text/plain', 'h' => 'text/plain', 'log' => 'text/plain', 'rng' => 'text/plain', 'txt' => 'text/plain', 'xsd' => 'text/plain', 'php' => Phar::PHP, // разбирается как PHP 'inc' => Phar::PHP, // разбирается как PHP 'avi' => 'video/avi', 'bmp' => 'image/bmp', 'css' => 'text/css', 'gif' => 'image/gif', 'htm' => 'text/html', 'html' => 'text/html', 'htmls' => 'text/html', 'ico' => 'image/x-ico', 'jpe' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'js' => 'application/x-javascript', 'midi' => 'audio/midi', 'mid' => 'audio/midi', 'mod' => 'audio/mod', 'mov' => 'movie/quicktime', 'mp3' => 'audio/mp3', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'pdf' => 'application/pdf', 'png' => 'image/png', 'swf' => 'application/shockwave-flash', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'wav' => 'audio/wav', 'xbm' => 'image/xbm', 'xml' => 'text/xml', ); ?> rewrite-
Функция перезаписи, которой передаётся единственный строковый параметр и которая должна также вернуть строку, либо
false.Если вы используете fast-cgi или cgi, то параметром, передаваемым в эту функцию будет значение переменной $_SERVER['PATH_INFO']. В ином случае передаваться будет значение переменной $_SERVER['REQUEST_URI'].
Если будет возвращена строка, то она будет использована как путь к файлу внутри архива. Если вернётся
false, то webPhar() пошлёт код ошибки HTTP 403.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Ошибки
Выбросит исключение PharException, если будет невозможно
открыть какой-либо файл, либо если вызывать её не из заглушки.
Если в параметре mimeTypes указать некорректный MIME-тип,
или в rewrite будет передана некорректная функция
обратного вызова, то будет выброшено исключение
UnexpectedValueException.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
Параметр fileNotFoundScript и rewrite
теперь допускают значение null.
|
Смотрите также
- Phar::mungServer() - Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
- Phar::interceptFileFuncs() - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
Сборщик выводит web.phar собран. Видимый ожидаемый результат выше — три реальных HTTP-запроса после запуска сервера. Выполните сборку, затем php -d phar.readonly=1 -S 127.0.0.1:8779 router.php; в другом терминале python probe_http.py. Можно открыть /web.phar/receipt.php в браузере. router.php содержит только require собственного web.phar; встроенный сервер передаёт туда запросы и сохраняет настоящий REQUEST_URI.
source/stub.php:
<?php
Phar::webPhar(null, 'receipt.php', 'missing.php', ['txt' => 'text/plain; charset=UTF-8']);
__HALT_COMPILER();source/receipt.php:
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "Личная выдача заказа\n";
echo file_get_contents(__DIR__ . '/receipt.txt');
source/missing.php:
<?php
http_response_code(404);
header('Content-Type: text/plain; charset=UTF-8');
echo "Документ не найден\n";
router.php:
<?php
require __DIR__ . '/web.phar';
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Phar::mungServerPhar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0) · Phar
final public static function Phar::mungServer(array $variables): voidВыдать документ из работающего веб-пакета. Веб-приложению нужны короткие SCRIPT_NAME/PHP_SELF внутри контейнера, а диагностика должна сохранять исходные значения с префиксом PHAR_.
Пять параметров webPhar: псевдоним, стартовый файл, PHP-обработчик отсутствия, дополнительные MIME и необязательный callback изменения пути. Здесь callback не нужен. header задаёт HTTP-заголовок до тела; http_response_code(404) задаёт статус отказа. Полные файлы перечислены после контракта и уже вложены в ZIP.
<?php
declare(strict_types=1);
$path = __DIR__ . '/web.phar';
if (file_exists($path)) { throw new RuntimeException('Нужна новая папка'); }
$archive = new Phar($path);
$archive->addFile(__DIR__ . '/input/receipt.txt', 'receipt.txt');
$archive->addFile(__DIR__ . '/source/receipt.php', 'receipt.php');
$archive->addFile(__DIR__ . '/source/missing.php', 'missing.php');
$stub = file_get_contents(__DIR__ . '/source/stub.php');
if ($stub === false) { throw new RuntimeException('Нет загрузчика'); }
$archive->setStub($stub);
echo "web.phar собран\n";
Ожидаемый результат
GET /web.phar/receipt.php → 200; text/plain; charset=UTF-8
Личная выдача заказа
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
SCRIPT_NAME: /receipt.php
PHAR_SCRIPT_NAME: /web.phar
PHP_SELF: /receipt.php
GET /web.phar/receipt.txt → 200; text/plain; charset=UTF-8
Заказ 42
Кисть — 2 шт.
Итого: 300 руб.
GET /web.phar/absent.txt → 404; text/plain; charset=UTF-8
Документ не найден
Проверка использует только 127.0.0.1. PHP-заголовок выставляет сама receipt.php; статический txt получает MIME из таблицы webPhar; missing.php сам выставляет404. mungServer действует только вместе с webPhar и только для исполняемой PHP-записи. Дата/порт/полный путь зависят от запуска, поэтому проверяются смысловые заголовки и точные тела, а все реальные заголовки сохраняются в http-observed.json.
Официальный контракт: адаптированная русская документация PHP Documentation Group, CC BY 3.0 или более поздняя версия. Изменены оформление и внутренние ссылки; условные иллюстрации заменены самостоятельными учебными проектами. Сигнатуры сверены с английской редакцией; уточнения версий отмечены отдельно.
Описание
Функция Phar::mungServer() должна вызываться только в загрузчике.
Определяет список до четырёх $_SERVER-переменных, которые
необходимо модифицировать для запуска.
Модификация заключается в удалении следов запуска из phar-архива для
переменных REQUEST_URI, PHP_SELF,
SCRIPT_NAME и SCRIPT_FILENAME.
Сам по себе этот метод ничего не делает. Эффект достигается только в комбинации
с Phar::webPhar() и только если запрошенный файл является
PHP-файлом для разбора. Обратите внимание, что переменные
PATH_INFO и PATH_TRANSLATED всегда
модифицированы.
Оригинальные значения изменяемых переменных будут сохранены в массиве SERVER
с префиксами PHAR_. Например, оригинальное значение
SCRIPT_NAME будет записано в PHAR_SCRIPT_NAME.
Список параметров
variables-
Массив любой из строк:
REQUEST_URI,PHP_SELF,SCRIPT_NAMEиSCRIPT_FILENAME. Любые другие значения вызовут исключение. Обратите внимание, что функция Phar::mungServer() чувствительна к регистру символов.
Возвращаемые значения
Ничего не возвращает.
Ошибки
Выбрасывает исключение UnexpectedValueException, если входные данные некорректны.
Смотрите также
- Phar::webPhar() - Направляет запрос из браузера во внутренний файл в phar-архиве
- Phar::setStub() - Устанавливает в Phar-архив заглушку, которая играет роль начального загрузчика PHP
Сборщик выводит web.phar собран. Видимый ожидаемый результат выше — три реальных HTTP-запроса после запуска сервера. Выполните сборку, затем php -d phar.readonly=1 -S 127.0.0.1:8779 router.php; в другом терминале python probe_http.py. Можно открыть /web.phar/receipt.php в браузере. router.php содержит только require собственного web.phar; встроенный сервер передаёт туда запросы и сохраняет настоящий REQUEST_URI.
Проверка isset($_SERVER["REQUEST_URI"]) до mungServer также инициализирует суперглобальный массив при auto_globals_jit. В проверенной PHP8.5.11 внутренняя подстановка пропускается, если $_SERVER ещё не инициализирован; раннее чтение поля делает исходные значения доступными. Мы не подставляем придуманные HTTP-значения вручную.
source/stub.php:
<?php
if (!isset($_SERVER['REQUEST_URI'])) { throw new RuntimeException('Нужен HTTP-запрос'); }
Phar::mungServer(['SCRIPT_NAME', 'PHP_SELF']);
Phar::webPhar(null, 'receipt.php', 'missing.php', ['txt' => 'text/plain; charset=UTF-8']);
__HALT_COMPILER();source/receipt.php:
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "Личная выдача заказа\n";
echo file_get_contents(__DIR__ . '/receipt.txt');
echo 'SCRIPT_NAME: ', $_SERVER['SCRIPT_NAME'], "\n";
echo 'PHAR_SCRIPT_NAME: ', $_SERVER['PHAR_SCRIPT_NAME'], "\n";
echo 'PHP_SELF: ', $_SERVER['PHP_SELF'], "\n";
source/missing.php:
<?php
http_response_code(404);
header('Content-Type: text/plain; charset=UTF-8');
echo "Документ не найден\n";
router.php:
<?php
require __DIR__ . '/web.phar';
Законченный следующий шаг: сборка и запуск приложения; для обмена документами — архив данных и безопасное чтение.
Источники и обсуждения
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


