Чем отличается phar от tar- или zip-архива?Составные части всех Phar-архивов вне зависимости от формата файла
Все Phar-архивы содержат от трёх до четырёх секций:
заглушкаманифест, описывающий содержимоесодержимое файла[необязательно] подпись для проверки целостности Phar (только для формата файла phar)Заглушка 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, Tar и Zip
Что хорошего и плохого в трёх поддерживаемых форматах файла в модуле phar?
В этой таблице предпринята попытка решить этот вопрос.
Матрица функционала: Phar против Tar против ZipФункционалPharTarZipСтандартный формат файлаНетДаДаВозможно выполнение без модуля 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.
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.
Phar-архивы, основанные на zip
Архивы, основанные на формате файла zip, поддерживают некоторые возможности,
встроенные в формат файла zip. Пофайловые и относящиеся ко всему архиву метаданные
хранятся в файловых комментариях zip и в комментарии всего zip-архива в виде сериализованных строк.
Уже существующие zip-комментарии будут успешно считаны в виде строки. Пофайловое
сжатие при чтении/записи поддерживается в случае использования сжатия zlib DEFLATE,
а в случае использования bzip2-сжатия поддерживается доступ на чтение.
Ограничений на количество файлов, содержащихся в phar-архиве, основанном на zip, нет.
Пустые каталоги хранятся в zip-архиве в виде файлов с завершающим слешем как my/directory/.
Формат файла phar
Формат файла phar буквально представляет из себя заглушку/манифест/содержимое/подпись и
хранит ключевую информацию о том, что включено в phar-архив в его манифесте.
Манифест Phar — это высокооптимизированный формат, который позволяет указывать
параметры сжатия файлов, доступа к файлам и даже определяемые пользователем метаданные,
такие как владелец или группа файла. Все значения, превышающие 1 байт,
хранятся в порядке байтов от младшего к старшему, за исключением версии API,
которая по историческим причинам хранится в виде 3 полубайт в порядке от старшего к младшему.
Все неиспользованные флаги зарезервированы для использования в будущем
и не должны быть использованы для хранения пользовательской информации.
Используйте возможности пофайловых метаданных для хранения индивидуальной
информации об отдельных файлах.
Основной формат файла манифеста Phar-архива выглядит следующим образом:
Формат глобального манифеста PharРазмер в байтахОписание4 байтаДлина манифеста в байтах (предел 1 МБ)4 байтаКоличество файлов в Phar-архиве2 байтаВерсия API манифеста Phar (текущая 1.0.0)4 байтаФлаги глобальной битовой карты Phar4 байтаДлина псевдонима Phar??Псевдоним Phar (длина основана на предыдущем значении)4 байтаДлина метаданных Phar (0 в случае отсутствия)??Сериализованные метаданные Phar, хранящиеся в формате serializeпо меньшей мере (24 * количество записей) байтзаписи для каждого файла
Флаги глобальной битовой карты Phar
Здесь представлены битовые флаги, на настоящий момент распознаваемые модулем Phar
для глобальной битовой карты Phar:
Распознаваемые значения битовой картыЗначениеОписание0x00010000Если задано, значит этот Phar содержит проверочную подпись0x00001000
Если задано, значит этот Phar содержит по меньшей мере один файл,
сжатый при помощи сжатия zlib DEFLATE.
0x00002000
Если задано, значит этот Phar содержит по меньшей мере один файл,
сжатый при помощи bzip2-сжатия.
Описание записи файла в манифесте Phar
Каждый файл в манифесте содержит следующую информацию:
Запись файла в манифесте 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-сжатия.
Формат подписи 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 используется для определения наличия подписи.