/
fileformat.xml
522 lines (521 loc) · 17.7 KB
/
fileformat.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f9c4a68ef4f89e51e6d9b905ad3ddb6492386dd3 Maintainer: gui Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="phar.fileformat" xmlns="http://docbook.org/ns/docbook">
<title>Qu'est-ce qui fait d'un phar un phar et pas un tar ou un zip ?</title>
<section xml:id="phar.fileformat.ingredients" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Les constituants de toutes les archives Phar, indépendamment du format de fichier</title>
<para>
Toute les archives Phar contiennent de trois à quatre sections:
<orderedlist>
<listitem>
<para>
Un conteneur
</para>
</listitem>
<listitem>
<para>
Un manifest décrivant le contenu
</para>
</listitem>
<listitem>
<para>
Le contenu du fichier
</para>
</listitem>
<listitem>
<para>
Une signature (facultative) pour vérifier l'intégrité
(uniquement avec le format de fichier phar)
</para>
</listitem>
</orderedlist>
</para>
</section>
<section xml:id="phar.fileformat.stub" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Le conteneur de fichier Phar</title>
<para>
Un conteneur Phar est un simple fichier PHP. Le conteneur minimal contient :
</para>
<para>
<programlisting role="php">
<![CDATA[<?php __HALT_COMPILER();]]>
</programlisting>
</para>
<para>
Un conteneur doit contenir au moins le jeton <literal>__HALT_COMPILER();</literal>
en guise de conclusion. Typiquement, un conteneur comportera les fonctionnalités
de chargement suivantes :
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
Phar::mapPhar();
include 'phar://monphar.phar/index.php';
__HALT_COMPILER();
]]>
</programlisting>
</para>
<para>
Il n'y a aucune restriction sur le contenu d'un conteneur Phar, si ce n'est le besoin d'être conclu
par <literal>__HALT_COMPILER();</literal>. Le tag fermant PHP <literal><![CDATA[?>]]></literal> peut être
inclus ou omis, mais il ne peut y avoir plus d'un espace entre le <literal>;</literal> et le tag fermant
<literal><![CDATA[?>]]></literal> sans quoi l'extension phar ne sera pas capable de lire le
manifeste de l'archive.
</para>
<para>
Dans une archive phar basée sur tar ou zip, le conteneur est stocké dans le fichier
<literal>.phar/stub.php</literal>. 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 <function>Phar::createDefaultStub</function> pour davantage de détails.
</para>
<para>
L'alias phar est stocké, dans le cas d'une archive phar basée sur tar ou zip, dans le fichier
<literal>.phar/alias.txt</literal> en tant que texte plein.
</para>
</section>
<section xml:id="phar.fileformat.comparison" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Comparaison entre Phar, Tar et Zip</title>
<para>
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.
<table>
<title>Tableau comparatif : Phar, Tar et Zip</title>
<tgroup cols="4">
<thead>
<row>
<entry>Fonctionnalité</entry>
<entry>Phar</entry>
<entry>Tar</entry>
<entry>Zip</entry>
</row>
</thead>
<tbody>
<row>
<entry>Format de fichier standard</entry>
<entry>Non</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Peut être exécuté sans l'extension Phar
<link linkend="phar.fileformat.phartip">[1]</link>
</entry>
<entry>Oui</entry>
<entry>Non</entry>
<entry>Non</entry>
</row>
<row>
<entry>Compression par fichier</entry>
<entry>Oui</entry>
<entry>Non</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Compression pour toute l'archive</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Non</entry>
</row>
<row>
<entry>Validation par signature de toute l'archive</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Support d'applications spécifiquement Web</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Métadonnées par fichier</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Métadonnées pour toute l'archive</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Création/modification d'archive
<link linkend="phar.fileformat.phartip2">[2]</link>
</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Support complet de toutes les fonctions de flux</entry>
<entry>Oui</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
<row>
<entry>Peut être créée/modifiée même si phar.readonly=1
<link linkend="phar.fileformat.phartip3">[3]</link>
</entry>
<entry>Non</entry>
<entry>Oui</entry>
<entry>Oui</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para xml:id="phar.fileformat.phartip">
<tip>
<para>
[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 <literal>conteneur</literal>
qui extrait le contenu de l'archive phar. Le conteneur
créé par <function>Phar::createDefaultStub</function> extrait
l'archive phar et exécute son contenu à partir d'un répertoire temporaire si
aucune extension phar n'est trouvée.
</para>
</tip>
</para>
<para xml:id="phar.fileformat.phartip2">
<tip>
<para>
[2] Tous les accès en écriture nécessitent que <literal>phar.readonly</literal> soit
désactivé dans le php.ini ou directement via la ligne de commande.
</para>
</tip>
</para>
<para xml:id="phar.fileformat.phartip3">
<tip>
<para>
[3] Seules les archives tar ou zip sans <literal>.phar</literal> dans leur
nom et sans conteneur exécutable <literal>.phar/stub.php</literal>
peuvent être créées si phar.readonly=1.
</para>
</tip>
</para>
</section>
<section xml:id="phar.fileformat.tar" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Les phars basés sur Tar</title>
<para>
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.
</para>
<para>
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 <literal>x</literal>
et <literal>g</literal>) sont silencieusement ignorés.
Il y a aussi un support limité pour les GNU Tar Archives;
actuellement, les en-têtes <literal>././@LongLink</literal> sont résolus.
</para>
<para>
Pour compresser une archive entière, utilisez <function>Phar::compress</function>.
Pour décompresser une archive entière, utilisez <function>Phar::decompress</function>.
</para>
</section>
<section xml:id="phar.fileformat.zip" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Les phars basés sur Zip</title>
<para>
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 <literal>mon/repertoire/</literal>
</para>
</section>
<section xml:id="phar.fileformat.phar" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Le format de fichier Phar</title>
<para>
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
<literal>manifeste</literal>.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
Le format de fichier basique du manifeste d'une archive Phar est le suivant :
</para>
<para>
<table>
<title>Format global du manifeste Phar</title>
<tgroup cols="2">
<thead>
<row>
<entry>Taille en octets</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>4 octets</entry>
<entry>Longueur du manifeste en octets (limitée à 1 Mo)</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Nombre de fichiers dans le Phar</entry>
</row>
<row>
<entry>2 octets</entry>
<entry>Version de l'API du manifest Phar (à ce jour 1.0.0)</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Drapeaux "bitmappés" globaux du Phar</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Longueur de l'alias Phar</entry>
</row>
<row>
<entry>??</entry>
<entry>L'alias Phar (longueur basée sur la valeur précédente)</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Longueur des métadonnées Phar (<literal>0</literal> si aucune)</entry>
</row>
<row>
<entry>??</entry>
<entry>métadonnées Phar sérialisées, stockées dans un format <function>serialize</function></entry>
</row>
<row>
<entry>au moins 24 * nombre d'octets des entrées</entry>
<entry>Entrées pour chaque fichier</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section xml:id="phar.fileformat.flags" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Drapeaux "bitmappés" globaux du Phar</title>
<para>
Voici les drapeaux "bitmappés" actuellement reconnus par l'extension Phar
pour le bitmap plein global de Phar :
</para>
<para>
<table>
<title>Valeurs de bitmap reconnues</title>
<tgroup cols="2">
<thead>
<row>
<entry>Valeur</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>0x00010000</literal></entry>
<entry>Si présent, le Phar contient une signature de vérification</entry>
</row>
<row>
<entry><literal>0x00001000</literal></entry>
<entry>
Si présent, le Phar contient au moins 1 fichier qui est
compressé grâce à zlib DEFLATE
</entry>
</row>
<row>
<entry><literal>0x00002000</literal></entry>
<entry>
Si présent, le Phar contient au moins 1 fichier qui est
compressé grâce à bzip2
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section xml:id="phar.fileformat.manifestfile" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Définition des entrées du manifeste Phar</title>
<para>
Chaque fichier du manifeste contient les informations suivantes :
</para>
<para>
<table>
<title>Entrée du manifeste Phar</title>
<tgroup cols="2">
<thead>
<row>
<entry>Taille en octets</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>4 octets</entry>
<entry>Longueur du nom de fichier en octets</entry>
</row>
<row>
<entry>??</entry>
<entry>Nom de fichier (longueur basée sur la valeur précédente)</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Taille du fichier décompressé en octets</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Timestamp Unix du fichier</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Taille du fichier compressé en octets</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Somme de contrôle CRC32 du contenu décompressé du fichier</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Drapeaux bitmappés spécifiques au fichier</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>Longueur des métadonnées du fichier sérialisées (<literal>0</literal> si aucune)</entry>
</row>
<row>
<entry>??</entry>
<entry>métadonnées du fichier sérialisées, stockées dans un format <function>serialize</function></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
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 <literal>mon/repertoire/</literal>
</para>
<para>
Les valeurs reconnues de drapeaux bitmappés spécifiques au fichier sont :
</para>
<para>
<table>
<title>Valeurs reconnues de bitmap</title>
<tgroup cols="2">
<thead>
<row>
<entry>Valeur</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>0x000001FF</literal></entry>
<entry>
Ces bits sont réservés pour définir des permissions spécifiques au fichier.
Celles-ci sont utilisées pour <function>fstat</function>
et peuvent être utilisées pour recréer les permissions souhaitées en cas d'extraction.
</entry>
</row>
<row>
<entry><literal>0x00001000</literal></entry>
<entry>
Si présent, le fichier est compressé grâce à zlib DEFLATE
</entry>
</row>
<row>
<entry><literal>0x00002000</literal></entry>
<entry>
Si présent, le fichier est compressé grâce à bzip2
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section xml:id="phar.fileformat.signature" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Phar Signature format</title>
<para>
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.
</para>
<para>
<table>
<title>Format de signature</title>
<tgroup cols="2">
<thead>
<row>
<entry>Longueur en octets</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>variant</entry>
<entry>
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.
</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>
Les drapeaux de signature. <literal>0x0001</literal> est utilisé pour
définir une signature MD5, <literal>0x0002</literal> pour une SHA1,
<literal>0x0003</literal> pour une SHA256 et <literal>0x0004</literal>
pour une SHA512. Le support des signatures SHA256 et SHA512 est disponible
à partir de la version 1.1.0 de l'API.
<literal>0x0010</literal> 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.
</entry>
</row>
<row>
<entry>4 octets</entry>
<entry>
<literal>GBMB</literal> magique utilisé pour définir la présence d'une signature.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->