Чем отличается 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 Функционал 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.
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 байта Флаги глобальной битовой карты Phar 4 байта Длина псевдонима 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 используется для определения наличия подписи.