1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00
Files
archived-doc-es/reference/phar/fileformat.xml
2025-07-03 21:51:59 +02:00

523 lines
18 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f9c4a68ef4f89e51e6d9b905ad3ddb6492386dd3 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="phar.fileformat" xmlns="http://docbook.org/ns/docbook">
<title>¿Qué hace que un phar sea un phar y no un tar o un zip?</title>
<section xml:id="phar.fileformat.ingredients" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Los componentes de todas las archivos Phar, independientemente del formato de archivo</title>
<para>
Todos los archivos Phar contienen de tres a cuatro secciones:
<orderedlist>
<listitem>
<para>
Un contenedor
</para>
</listitem>
<listitem>
<para>
Un manifiesto que describe el contenido
</para>
</listitem>
<listitem>
<para>
El contenido del archivo
</para>
</listitem>
<listitem>
<para>
Una firma (opcional) para verificar la integridad
(solo con el formato de archivo 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>El contenedor de archivo Phar</title>
<para>
Un contenedor Phar es un simple archivo PHP. El contenedor mínimo contiene:
</para>
<para>
<programlisting role="php">
<![CDATA[<?php __HALT_COMPILER();]]>
</programlisting>
</para>
<para>
Un contenedor debe contener al menos el token <literal>__HALT_COMPILER();</literal>
como conclusión. Típicamente, un contenedor contendrá las siguientes funcionalidades
de carga:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
Phar::mapPhar();
include 'phar://monphar.phar/index.php';
__HALT_COMPILER();
]]>
</programlisting>
</para>
<para>
No hay restricciones sobre el contenido de un contenedor Phar, excepto la necesidad de
concluir con <literal>__HALT_COMPILER();</literal>. La etiqueta de cierre PHP <literal><![CDATA[?>]]></literal> puede ser
incluida u omitida, pero no puede haber más de un espacio entre el <literal>;</literal> y la etiqueta de cierre
<literal><![CDATA[?>]]></literal>, de lo contrario la extensión phar no será capaz de leer el
manifiesto del archivo.
</para>
<para>
En un archivo phar basado en tar o zip, el contenedor se almacena en el archivo
<literal>.phar/stub.php</literal>. El contenedor por defecto de los archivos Phar basados en
phar contiene aproximadamente 7ko de código para extraer el contenido del phar y ejecutarlo.
Consulte la función <function>Phar::createDefaultStub</function> para más detalles.
</para>
<para>
El alias phar se almacena, en el caso de un archivo phar basado en tar o zip, en el archivo
<literal>.phar/alias.txt</literal> como texto plano.
</para>
</section>
<section xml:id="phar.fileformat.comparison" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Comparación entre Phar, Tar y Zip</title>
<para>
¿Cuáles son las ventajas y desventajas de cada uno de los tres formatos soportados
por la extensión phar? Esta tabla intenta responder a esta pregunta.
<table>
<title>Tabla comparativa: Phar, Tar y Zip</title>
<tgroup cols="4">
<thead>
<row>
<entry>Funcionalidad</entry>
<entry>Phar</entry>
<entry>Tar</entry>
<entry>Zip</entry>
</row>
</thead>
<tbody>
<row>
<entry>Formato de archivo estándar</entry>
<entry>No</entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Puede ser ejecutado sin la extensión Phar
<link linkend="phar.fileformat.phartip">[1]</link>
</entry>
<entry></entry>
<entry>No</entry>
<entry>No</entry>
</row>
<row>
<entry>Compresión por archivo</entry>
<entry></entry>
<entry>No</entry>
<entry></entry>
</row>
<row>
<entry>Compresión para todo el archivo</entry>
<entry></entry>
<entry></entry>
<entry>No</entry>
</row>
<row>
<entry>Validación por firma de todo el archivo</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Soporte de aplicaciones específicamente web</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Metadatos por archivo</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Metadatos para todo el archivo</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Creación/modificación de archivo
<link linkend="phar.fileformat.phartip2">[2]</link>
</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Soporte completo de todas las funciones de flujo</entry>
<entry></entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry>Puede ser creado/modificado incluso si phar.readonly=1
<link linkend="phar.fileformat.phartip3">[3]</link>
</entry>
<entry>No</entry>
<entry></entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para xml:id="phar.fileformat.phartip">
<tip>
<para>
[1] PHP no puede acceder directamente al contenido de un archivo Phar sin que la extensión
Phar esté instalada si utiliza un <literal>contenedor</literal>
que extrae el contenido del archivo phar. El contenedor
creado por <function>Phar::createDefaultStub</function> extrae
el archivo phar y ejecuta su contenido desde un directorio temporal si
no se encuentra ninguna extensión phar.
</para>
</tip>
</para>
<para xml:id="phar.fileformat.phartip2">
<tip>
<para>
[2] Todos los accesos en escritura requieren que <literal>phar.readonly</literal> esté
desactivado en el php.ini o directamente desde la línea de comandos.
</para>
</tip>
</para>
<para xml:id="phar.fileformat.phartip3">
<tip>
<para>
[3] Solo los archivos tar o zip sin <literal>.phar</literal> en su
nombre y sin contenedor ejecutable <literal>.phar/stub.php</literal>
pueden ser creados 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>Los phars basados en Tar</title>
<para>
Los archivos basados en el formato de archivo tar son conformes al formato moderno
USTAR. El diseño de los encabezados del archivo tar lo hace más eficiente que el formato de archivo zip
y tan eficiente como el formato de archivo phar cuando se trata de acceder a los datos.
Los nombres de archivos están limitados a 255 bytes, incluyendo la ruta completa dentro del archivo phar
basado en tar. Estos archivos pueden ser completamente comprimidos en formato gzip o bzip2 mientras
siguen siendo ejecutables por la extensión Phar.
</para>
<para>
Hay un soporte limitado para leer los tarballs en el formato pax interchangeable,
pero todos los encabezados pax reconocidos (actualmente, typeflag <literal>x</literal>
y <literal>g</literal>) son silenciosamente ignorados.
También hay un soporte limitado para los archivos GNU Tar;
actualmente, los encabezados <literal>././@LongLink</literal> son resueltos.
</para>
<para>
Para comprimir un archivo completo, utilice <function>Phar::compress</function>.
Para descomprimir un archivo completo, utilice <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>Los phars basados en Zip</title>
<para>
Los archivos basados en el formato de archivo zip soportan numerosas funcionalidades
incluidas en el formato zip. Los metadatos por archivo o sobre todo el archivo se almacenan
en los comentarios del archivo zip y del archivo zip como una cadena de caracteres serializada.
Los comentarios zip ya existentes serán leídos sin problemas como una cadena. Las lecturas/escrituras
comprimidas son soportadas por la compresión zlib DEFLATE, y solo las lecturas comprimidas por
la compresión bzip2. No hay límite en el número de archivos dentro de un archivo phar
basado en zip. Los directorios vacíos se almacenan en el archivo zip como archivos con una barra final,
como <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>El formato de archivo Phar</title>
<para>
El formato de archivo phar está compuesto por contenedor/manifiesto/contenido/firma, y almacena
las informaciones cruciales de lo que está contenido en el archivo phar en su
<literal>manifiesto</literal>.
</para>
<para>
El manifiesto Phar es un formato altamente optimizado que permite la especificación archivo por archivo
de la compresión, los permisos y hasta metadatos de usuario tales como el usuario o el
grupo propietario. Todos los valores de más de un byte son almacenados en formato little-endian,
A excepción de la versión de la API que es almacenada por razones históricas en 3 trozos
big-endian.
</para>
<para>
Todos los flags no utilizados están reservados para un uso futuro y no deben ser utilizados
para almacenar informaciones personalizadas. Utilice los metadatos por archivo para almacenar
metadatos personalizados sobre archivos particulares.
</para>
<para>
El formato de archivo básico del manifiesto de un archivo Phar es el siguiente:
</para>
<para>
<table>
<title>Formato global del manifiesto Phar</title>
<tgroup cols="2">
<thead>
<row>
<entry>Tamaño en bytes</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry>4 bytes</entry>
<entry>Longitud del manifiesto en bytes (limitada a 1 MB)</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Número de archivos en el Phar</entry>
</row>
<row>
<entry>2 bytes</entry>
<entry>Versión de la API del manifiesto Phar (actualmente 1.0.0)</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Flags "bitmapped" globales del Phar</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Longitud del alias Phar</entry>
</row>
<row>
<entry>??</entry>
<entry>El alias Phar (longitud basada en el valor anterior)</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Longitud de los metadatos Phar (<literal>0</literal> si no hay)</entry>
</row>
<row>
<entry>??</entry>
<entry>Metadatos Phar serializados, almacenados en un formato <function>serialize</function></entry>
</row>
<row>
<entry>al menos 24 * bytes de las entradas</entry>
<entry>Entradas para cada archivo</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>Flags "bitmapped" globales del Phar</title>
<para>
Estos son los flags "bitmapped" actualmente reconocidos por la extensión Phar
para el bitmap completo global de Phar:
</para>
<para>
<table>
<title>Valores de bitmap reconocidos</title>
<tgroup cols="2">
<thead>
<row>
<entry>Valor</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>0x00010000</literal></entry>
<entry>Si está presente, el Phar contiene una firma de verificación</entry>
</row>
<row>
<entry><literal>0x00001000</literal></entry>
<entry>
Si está presente, el Phar contiene al menos 1 archivo que es
comprimido mediante zlib DEFLATE
</entry>
</row>
<row>
<entry><literal>0x00002000</literal></entry>
<entry>
Si está presente, el Phar contiene al menos 1 archivo que es
comprimido mediante 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>Definición de las entradas del manifiesto Phar</title>
<para>
Cada archivo del manifiesto contiene las siguientes informaciones:
</para>
<para>
<table>
<title>Entrada del manifiesto Phar</title>
<tgroup cols="2">
<thead>
<row>
<entry>Tamaño en bytes</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry>4 bytes</entry>
<entry>Longitud del nombre de archivo en bytes</entry>
</row>
<row>
<entry>??</entry>
<entry>Nombre de archivo (longitud basada en el valor anterior)</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Tamaño del archivo descomprimido en bytes</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Timestamp Unix del archivo</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Tamaño del archivo comprimido en bytes</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Suma de control CRC32 del contenido descomprimido del archivo</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Flags bitmapped específicos del archivo</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>Longitud de los metadatos del archivo serializados (<literal>0</literal> si no hay)</entry>
</row>
<row>
<entry>??</entry>
<entry>Metadatos del archivo serializados, almacenados en un formato <function>serialize</function></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
Se debe notar que a partir de la API 1.1.1, los directorios vacíos son almacenados como nombres de archivo
con una barra final como <literal>mon/repertoire/</literal>
</para>
<para>
Los valores reconocidos de flags bitmapped específicos del archivo son:
</para>
<para>
<table>
<title>Valores reconocidos de bitmap</title>
<tgroup cols="2">
<thead>
<row>
<entry>Valor</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>0x000001FF</literal></entry>
<entry>
Estos bits están reservados para definir permisos específicos del archivo.
Estos son utilizados para <function>fstat</function>
y pueden ser utilizados para recrear los permisos deseados en caso de extracción.
</entry>
</row>
<row>
<entry><literal>0x00001000</literal></entry>
<entry>
Si está presente, el archivo es comprimido mediante zlib DEFLATE
</entry>
</row>
<row>
<entry><literal>0x00002000</literal></entry>
<entry>
Si está presente, el archivo es comprimido mediante 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>Formato de firma Phar</title>
<para>
Los Phar que contienen una firma siempre tienen la firma añadida al final del Phar,
después del cargador, el manifiesto y el contenido.
Los tipos de firma soportados hasta la fecha son MD5, SHA1, SHA256, SHA512,
y OPENSSL.
</para>
<para>
<table>
<title>Formato de firma</title>
<tgroup cols="2">
<thead>
<row>
<entry>Longitud en bytes</entry>
<entry>Descripción</entry>
</row>
</thead>
<tbody>
<row>
<entry>variante</entry>
<entry>
La firma actual, 20 bytes para una SHA1,
16 bytes para una MD5, 32 bytes para una SHA256,
y 64 bytes para una SHA512. La longitud de una firma
OPENSSL depende del tamaño de la clave privada.
</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>
Los flags de firma. <literal>0x0001</literal> es utilizado para
definir una firma MD5, <literal>0x0002</literal> para una SHA1,
<literal>0x0003</literal> para una SHA256 y <literal>0x0004</literal>
para una SHA512. El soporte para las firmas SHA256 y SHA512 está disponible
a partir de la versión 1.1.0 de la API.
<literal>0x0010</literal> es utilizado para definir una firma OPENSSL,
que está disponible a partir de la versión 1.1.1 de la API, si OpenSSL está disponible.
</entry>
</row>
<row>
<entry>4 bytes</entry>
<entry>
<literal>GBMB</literal> mágico utilizado para definir la presencia de una firma.
</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
-->