Qu'est-ce qui fait d'un phar un phar et pas un tar ou un zip ?Les constituants de toutes les archives Phar, indépendamment du format de fichier
Toute les archives Phar contiennent de trois à quatre sections:
Un conteneur
Un manifest décrivant le contenu
Le contenu du fichier
Une signature (facultative) pour vérifier l'intégrité
(uniquement avec le format de fichier phar)
Le conteneur de fichier Phar
Un conteneur Phar est un simple fichier PHP. Le conteneur minimal contient :
Un conteneur doit contenir au moins le jeton __HALT_COMPILER();
en guise de conclusion. Typiquement, un conteneur comportera les fonctionnalités
de chargement suivantes :
Il n'y a aucune restriction sur le contenu d'un conteneur Phar, si ce n'est le besoin d'être conclu
par __HALT_COMPILER();. Le tag fermant PHP ]]> peut être
inclus ou omis, mais il ne peut y avoir plus d'un espace entre le ; et le tag fermant
]]> sans quoi l'extension phar ne sera pas capable de lire le
manifeste de l'archive.
Dans une archive phar basée sur tar ou zip, le conteneur est stocké dans le fichier
.phar/stub.php. Le conteneur par défaut des archives Phar basées sur
phar contient approximativement 7ko de code pour extraire le contenu du phar et l'exécuter.
Regardez la fonction Phar::createDefaultStub pour davantage de détails.
L'alias phar est stocké, dans le cas d'une archive phar basée sur tar ou zip, dans le fichier
.phar/alias.txt en tant que texte plein.
Comparaison entre Phar, Tar et Zip
Quels sont les avantages et les inconvénients de chacun des trois formats supportés
par l'extension phar ? Ce tableau tente de répondre à cette question.
Tableau comparatif : Phar, Tar et ZipFonctionnalitéPharTarZipFormat de fichier standardNonOuiOuiPeut être exécuté sans l'extension Phar
[1]
OuiNonNonCompression par fichierOuiNonOuiCompression pour toute l'archiveOuiOuiNonValidation par signature de toute l'archiveOuiOuiOuiSupport d'applications spécifiquement WebOuiOuiOuiMétadonnées par fichierOuiOuiOuiMétadonnées pour toute l'archiveOuiOuiOuiCréation/modification d'archive
[2]
OuiOuiOuiSupport complet de toutes les fonctions de fluxOuiOuiOuiPeut être créée/modifiée même si phar.readonly=1
[3]
NonOuiOui
[1] PHP ne peut accéder directement au contenu d'une archive Phar sans que l'extension
Phar soit installée si elle utilise un conteneur
qui extrait le contenu de l'archive phar. Le conteneur
créé par Phar::createDefaultStub extrait
l'archive phar et exécute son contenu à partir d'un répertoire temporaire si
aucune extension phar n'est trouvée.
[2] Tous les accès en écriture nécessitent que phar.readonly soit
désactivé dans le php.ini ou directement via la ligne de commande.
[3] Seules les archives tar ou zip sans .phar dans leur
nom et sans conteneur exécutable .phar/stub.php
peuvent être créées si phar.readonly=1.
Les phars basés sur Tar
Les archives basées sur le format de fichier tar sont conformes au format moderne
USTAR. Le design des en-têtes du fichier tar le rend plus efficace que le format de fichier zip
et aussi efficace que le format de fichier phar quand il s'agit d'accéder aux données.
Les noms de fichiers sont limités à 255 octets, y compris le chemin complet au sein de l'archive phar
basée sur tar. Ces archives peuvent être intégralement compressées au format gzip ou bzip2 tout
en restant exécutables par l'extension Phar.
Il y a un support limité pour lire les tarballs dans le format pax interchange,
mais tout les en-têtes pax reconnues (actuellement, typeflag x
et g) sont silencieusement ignorés.
Il y a aussi un support limité pour les GNU Tar Archives;
actuellement, les en-têtes ././@LongLink sont résolus.
Pour compresser une archive entière, utilisez Phar::compress.
Pour décompresser une archive entière, utilisez Phar::decompress.
Les phars basés sur Zip
Les archives basées sur le format de fichier zip supportent de nombreuses fonctionnalités
incluses dans le format zip. Les métadonnées par fichier ou sur toute l'archive sont stockées
dans les commentaires du fichier zip et de l'archive zip en tant que chaîne de caractères sérialisée.
Les commentaires zip déjà existants seront lus sans problème en tant que chaîne. Les lectures/écritures
compressées sont supportées par la compression zlib DEFLATE, et uniquement les lectures compressées par
la compression bzip2. Il n'y a pas de limite sur le nombre de fichiers au sein d'une archive phar
basée sur zip. Les répertoires vides sont stockés dans l'archive zip comme des fichiers avec un slash final,
comme mon/repertoire/Le format de fichier Phar
Le format de fichier phar est composé de conteneur/manifeste/contenu/signature, et stocke
les informations cruciales de ce qui est contenu dans l'archive phar dans son
manifeste.
Le manifeste Phar est un format hautement optimisé qui permet la spécification fichier par fichier
de la compression, des permissions et même des métadonnées utilisateur tels que l'utilisateur ou le
groupe propriétaire. Toutes les valeurs de plus d'un octet sont stockées sous forme petit-boutiste,
A l'exception de la version de l'API qui est stockée pour des raisons historiques en 3 morceaux
grand-boutistes.
Tous les drapeaux non utilisés sont réservés pour un usage futur et ne doivent pas être utilisés
pour stocker des informations personnalisées. Utilisez les métadonnées par fichier pour stocker
des métadonnées personnalisées sur des fichiers particuliers.
Le format de fichier basique du manifeste d'une archive Phar est le suivant :
Format global du manifeste PharTaille en octetsDescription4 octetsLongueur du manifeste en octets (limitée à 1 Mo)4 octetsNombre de fichiers dans le Phar2 octetsVersion de l'API du manifest Phar (à ce jour 1.0.0)4 octetsDrapeaux "bitmappés" globaux du Phar4 octetsLongueur de l'alias Phar??L'alias Phar (longueur basée sur la valeur précédente)4 octetsLongueur des métadonnées Phar (0 si aucune)??métadonnées Phar sérialisées, stockées dans un format serializeau moins 24 * nombre d'octets des entréesEntrées pour chaque fichier
Drapeaux "bitmappés" globaux du Phar
Voici les drapeaux "bitmappés" actuellement reconnus par l'extension Phar
pour le bitmap plein global de Phar :
Valeurs de bitmap reconnuesValeurDescription0x00010000Si présent, le Phar contient une signature de vérification0x00001000
Si présent, le Phar contient au moins 1 fichier qui est
compressé grâce à zlib DEFLATE
0x00002000
Si présent, le Phar contient au moins 1 fichier qui est
compressé grâce à bzip2
Définition des entrées du manifeste Phar
Chaque fichier du manifeste contient les informations suivantes :
Entrée du manifeste PharTaille en octetsDescription4 octetsLongueur du nom de fichier en octets??Nom de fichier (longueur basée sur la valeur précédente)4 octetsTaille du fichier décompressé en octets4 octetsTimestamp Unix du fichier4 octetsTaille du fichier compressé en octets4 octetsSomme de contrôle CRC32 du contenu décompressé du fichier4 octetsDrapeaux bitmappés spécifiques au fichier4 octetsLongueur des métadonnées du fichier sérialisées (0 si aucune)??métadonnées du fichier sérialisées, stockées dans un format serialize
A noter qu'à partir de l'API 1.1.1, les répertoires vides sont stockés comme des noms de fichier
avec un slash final comme mon/repertoire/
Les valeurs reconnues de drapeaux bitmappés spécifiques au fichier sont :
Valeurs reconnues de bitmapValeurDescription0x000001FF
Ces bits sont réservés pour définir des permissions spécifiques au fichier.
Celles-ci sont utilisées pour fstat
et peuvent être utilisées pour recréer les permissions souhaitées en cas d'extraction.
0x00001000
Si présent, le fichier est compressé grâce à zlib DEFLATE
0x00002000
Si présent, le fichier est compressé grâce à bzip2
Phar Signature format
Les Phar qui contiennent une signature ont toujours la signature ajoutée à la fin du Phar,
après le chargeur, le manifeste et le contenu.
Les types de signature supportés à ce jour sont MD5, SHA1, SHA256, SHA512,
et OPENSSL.
Format de signatureLongueur en octetsDescriptionvariant
La signature actuelle, 20 octets pour une SHA1,
16 octets pour une MD5, 32 octets pour une SHA256,
et 64 octets pour une SHA512. La longueur d'une signature
OPENSSL dépend de la taille de la clé privée.
4 octets
Les drapeaux de signature. 0x0001 est utilisé pour
définir une signature MD5, 0x0002 pour une SHA1,
0x0003 pour une SHA256 et 0x0004
pour une SHA512. Le support des signatures SHA256 et SHA512 est disponible
à partir de la version 1.1.0 de l'API.
0x0010 est utilisé pour définir une signature OPENSSL,
qui est disponible à partir de la version 1.1.1 de l'API, si OpenSSL est disponible.
4 octetsGBMB magique utilisé pour définir la présence d'une signature.