¿Qué es phar?

Original de John Mertic

El concepto de los archivos JAR Phar provienen de la tecnología Java ™ de archivos, que permiten empaquetar una aplicación en un solo archivo que contiene todo lo necesario para ejecutar la aplicación.

La extensión Phar no es algo nuevo en PHP. Fue escrito inicialmente en PHP y conocido como PHP_Archive, y se añadió al repositorio PEAR en 2005. Sin embargo, esta solución pura de PHP es bastante lenta por lo que fue reescrita como una extensión de C en 2007. Desde entonces, se ha mejorado el rendimiento de los archivos Phar.

Los archivos phar pueden ser ejecutados por PHP fácilmente al igual que cualquier otro fichero, tanto desde la línea de comandos como desde un servidor web. Así mismo se pueden usar archivos individuales empaquetados en el phar:

<?php
 include 'phar:///ruta/a/miphar.phar/fichero.php';
 ?>

Incluso con la extensión phar deshabilitada, se puede ejecutar o incluir un archivo basado en phar. El acceso a ficheros dentro de un archivo phar solamente es posible con la extensión phar activa.

Creación de un Phar

Hay varios pasos necesarios para crear un archivo Phar. En primer lugar, para crear y modificar los archivos Phar, la configuración de phar.readonly  en php.ini  debe establecerse en 0.

El primer paso es crear el fichero Phar, por lo que vamos a hacer esto creando el objeto Phar con que vamos a trabajar. La referencia de objeto permite controlar todos los aspectos del archivo Phar.

$p = new Phar ('/ ruta / a / my.phar', CURRENT_AS_FILEINFO | KEY_AS_FILENAME, 'my.phar');
$p->startBuffering ();

El primer parámetro del constructor es la ruta donde el archivo Phar será guardado.
El segundo parámetro pasa los parámetros a la clase padre RecursiveDirectoryIterator.
El tercer parámetro es el alias de la forma de este archivo Phar se hace referencia en el contexto del stream.

Así se puede hacer referencia a un archivo dentro de este Phar como far://my.phar. Al capturar la salida de los cambios relaizados con Phar::startBuffering() mejora el rendimiento de la creación o modificación de un archivo, ya que evita la necesidad de guardar los cambios en el archivo cada vez que se altera en el script.

Por defecto, el Phar creado utilizará el formato phar nativo. También puede utilizar el formato ZIP o TAR para el archivo Phar mediante la conversión a ese formato:

$p = $p->convertToExecutable (Phar :: ZIP);

Hay ventajas y desventajas para cambiar el formato de archivo. La principal ventaja es la posibilidad de inspeccionar el contenido del archivo con cualquiera de las herramientas para tratar con los archivos ZIP o TAR. Sin embargo, utilizando un archivo Phar no siempre es necesaria la extension Phar.

El siquiente paso es definir un archivo Stub, que es el primer código de llamada cuando el archivo Phar está cargado.

Archivo Stub

El archivo no es más que un pequeño segmento de código que se ejecuta inicialmente cuando se carga el archivo Phar con un include o se ejcuta desde consola. Siempre ha de terminar con__HALT_COMPILER().

Archivo Stub:

<?php
Phar::mapPhar();
include 'phar://myphar.phar/index.php';
__HALT_COMPILER();

La llamda Phar::mapPhar() inicializa el archivo Phar mediante la lectura del manifiesto. Se tiene que hacer esto antes de referenciar los archivos usando far:// . El archivo que se cargue inicialmente sería lo que el archivo de la aplicación normalmente carga en primer lugar; por ejemplo: index.php.

Para agregar este archivo stub a su archivo Phar depende de qué formato de archivo se esté utilizando. Para archicos basados en phar podemos utilizar el método Phar::setStub() pasándole como parámetro el contenido del archivo stub como una cadena de texto:

$p->setStub('<?php Phar::mapPhar();
include 'phar://myphar.phar/index.php'; __HALT_COMPILER(); ?>');

Por otra parte si sólo se pretende redireccionar a index.php, se puede usar el método har::createDefaultStub() para crear el stub:

$p->setStub($p-> createDefaultStub('index.php'));

Se puede pasar un segundo argumento opcional a createDefaultStub() para incluir un archivo diferente si el Phar se carga desde un servidor Web. Esto es útil en caso de que su aplicación está diseñada para ser utilizada en una línea de comandos y en un contexto Web.

Para implementaciones ZIP y TAR-basado, se almacena el contenido del archivo dentro del archivo .phar / stub.php, en lugar de utilizar el setStub() de comandos.

Adición de archivos al archivo

El objeto Phar objeto utiliza la interface SPL ArrayAccess para permitir acceder a los contenidos del archivo como una matriz, por lo que abre muchas maneras de añadir archivos al archivo. La forma más sencilla es utilizar la interfaz ArrayAccess directamente.

$p['file.txt'] = 'This is a text file';
$p['index.php'] = file_get_contents('index.php');

El listado anterior muestra que el nombre del archivo se especifica como la clave de la matriz y el contenido como el valor. Se puede usar file_get_contents() función para obtener el contenido de un archivo existente para establecer como valor. Esto proporciona un poco de flexibilidad sobre la forma de agregar un archivo a un archivo, ya sea por referencia a un archivo existente o crear un archivo sobre la marcha.

Si el archivo que se almacena en el archivo Phar es grande, tiene la opción de comprimir el archivo utilizando compresión gzip o bzip2 a través de los métodos PharFileInfo::setCompressedGZ() o PharFileInfo::setCompressedBZIP2() respectivamente.

$p['big.txt'] = 'This is a big text file';
$p['big.txt']->setCompressedBZIP2();

Para usar métodos de compresión las extensiones bzip2, zlib correspondientes deben estar habilitadas en la instalación de PHP.

La addición de archivos uno a uno puede resultar muy tediosa. Afortunadamente pode mos agreagr un directorio completo:

$p->buildFromDirectory('/path/to/files','./\.php$/');

Como se puede observar, Phar::buildFromDirectory() acepta dos parámetros : el path al directorio que contiene los archivos a agregar y una expresión regular para que coincida con los archivos para añadir.
Nota: A continuación, puede volver a utilizar la interfaz ArrayAccess si es necesario realizar algún cambio en los archivos añadidos, o comprimirlos.

Otra forma de añadir ficheros es usando el iterador Phar::buildFromIterator(). Existen dos tipos de iteradores son compatibles: los iteradores que asignan el nombre del archivo en el Phar al nombre de un archivo en el disco y los iteradores que devuelven objetos SplFileInfo objetos.

Un iterador compatible es el RecursiveDirectoryIterator , que se utiliza a continuación para agregar los archivos en un directorio al archivo:

$p->buildFromIterator(new RecursiveIteratorIterator (new RecursiveDirectoryIterator('/path/to/files')),'/path/to/files');

El método Phar::buildFromIterator() acepta como el único argumento el objeto iterador mismo .

Finalmente detenemos las peticiones de escritura en buffer del archivo Phar, y guardamos los cambios en disco:

<code>$p->stopBuffering();</code>

Ahora hemos creado un archivo de Phar, my.phar, que puede ser utilizado por cualquier aplicación PHP.

Usar archivos Phar

La parte buena de archivos Phar es lo fácil que es integrarlos en cualquier aplicación. Especialmente se ha usado el formato nativo Phar. En este caso, ni siquiera se necesita la extensión Phar instalada.

Los archivos Phar están diseñados para ser incluidos dentro de una aplicación como cualquier archivo PHP normal. La forma más sencilla de integrar el código en un archivo Phar es simplemente incluyendo el archivo Phar, que se desea utilizar.

include 'myphar.phar';
include 'phar://myphar.phar/file.php';

El primer include cargará el archivo myphar.phar, incluyendo el código especificado en el archivo Stub. El segundo include utiliza la envoltura de secuencia para abrir el archivo Phar y sólo incluye el archivo especificado dentro del archivo. Tenga en cuenta que no es necesario incluir el archivo Phar sí mismo antes de incluir un archivo dentro del archivo, como se muestra en el Listado 10.

Una de las cosas interesantes que se pueden hacer con los archivos Phar es empaquetar una aplicación completa con un archivo Phar y distribuirla de esa manera. La ventaja de este enfoque es que hace que sea fácil de desplegar la aplicación y sin penalizar el rendimiento, gracias a varias de las mejoras realizadas en Phar en PHP V5.3. Sin embargo, cuando se diseña una aplicación se ejecute dentro de un Phar, aquí hay algunas consideraciones con el diseño de la aplicación que se debe tener en cuenta:

      Los archivos que pueden ser específicos de una cada aplicación, como archivos de configuración, no pueden formar parte del archivo, por lo que tendrás que escribir en un lugar separado, pero accesible. Lo mismo ocurre si la aplicación crea algún archivo de caché como parte de la ejecución.
      Se debe adherir al formato de archivo basado en Phar sin compresión para mejorar la portabilidad. Los formatos basados en ZIP y TAR requieren la extensión Phar para ser instalado en PHP, mientras que los basados ​​en el formato nativo Phar pueden ser utilizado incluso cuando la extensión Phar no está instaladoa.

Referencias:

Posted in php