A differenza di altri linguaggi di programmazione (come ad esempio Java), PHP non mette a disposizione un solo file eseguibile per il rilascio di un'applicazione. Per ovviare a questo problema ci viene incontro la libreria PHAR (“PHp ARchive”) con cui possiamo generare un pacchetto del nostro progetto da distribuire.
Un altro utilizzo molto comune della libreria è il rilascio di applicazioni da riga di comando. Se avete già avuto modo di utilizzare la libreria Composer, questo è un esempio di applicazione sviluppata in PHP e rilasciata utilizzando la libreria PHAR.
Prima di entrare nel dettaglio del suo utilizzo dobbiamo assicurarci che la configurazione del nostro ambiente PHP ci consenta di creare archivi PHAR. Dalla nostra console lanciamo il comando:
php -i | grep "phar.readonly"
phar.readonly => On => On
Nel caso in cui il risultato sia simile al precedente, dobbiamo aprire il php.ini
e impostare il valore di phar.readonly
a 0
. Questo consentirà non solo di leggere i file PHAR ma anche di crearne di nuovi.
Struttura di un archivio PHAR
Iniziamo a creare la struttura della nostra applicazione. Dapprima creiamo due directory:
dist/ #conterrà l'eseguibile generato dal PHAR
src/ #conterrà i file sorgenti della nostra applicazione
All'interno della directory src
iniziamo ad inserire un file index.php
che rappresenterà il punto d'ingresso dell'applicazione.
<?php
#src/index.php
require_once "phar://exampleapp.phar/example.php";
Come possiamo notare viene richiesto un file example.php
contenuto all'interno di un file PHAR. Creiamolo inserendo del codice d'esempio così da simulare una qualsiasi applicazione.
<?php
#src/example.php
echo "Questa è la mia applicazione compressa con PHAR\n";
Generare un file PHAR
Una volta completato il codice necessario al nostro progetto possiamo dedicarci alla creazione del pacchetto. Nella root del progetto creiamo un nuovo file che utilizzeremo per generare il PHAR:
<?php
#generate-phar.php
$sourceDirectory = './src';
$buildDirectory = './dist';;
$phar = new Phar(
$buildDirectory . "/exampleapp.phar",
FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME,
"exampleapp.phar"
);
$phar["index.php"] = file_get_contents($sourceDirectory . "/index.php");
$phar["example.php"] = file_get_contents($sourceDirectory . "/example.php");
$phar->setStub($phar->createDefaultStub("index.php"));
Analizziamo il codice appena scritto. Dopo aver definito le directory con i sorgenti e quella in cui salveremo il pacchetto, abbiamo creato un oggetto Phar
. I parametri passati sono tre:
- path del file PHAR da generare;
- flag che indica come verranno gestiti i file. L'oggetto
Phar
estende la classeRecursiveDirectoryIterator
che necessita di tale valore, nell'esempio abbiamo utilizzato il default della sua classe "genitore" - l'alias per riferirci alla nostra applicazione. E' il valore che abbiamo indicato all'interno del
require
inserito nel fileindex.php
: "phar://exampleapp.phar/example.php".
Per eventuali dubbi sugli oggetti con PHP fare riferimento alla guida PHP OOP.
Ora che abbiamo definito il nostro oggetto possiamo includere il contenuto dei file necessari al progetto:
$phar["index.php"] = file_get_contents($sourceDirectory . "/index.php");
$phar["example.php"] = file_get_contents($sourceDirectory . "/example.php");
A questo punto possiamo settare lo Stub, cioè il file di ingresso dell'applicazione.
$phar->setStub($phar->createDefaultStub("index.php"));
Dalla console andiamo quindi a creare il file PHAR:
php generate-phar.php
Verifichiamo che esista un file exampleapp.phar
nella cartella dist
. Possiamo lanciare il phar sempre da riga di comando:
php dist/exampleapp.phar
il cui output dovrebbe essere:
Questa è la mia applicazione compressa con PHAR
Eseguire PHAR da Web server
Oltre che da riga di comando possiamo eseguire PHAR direttamente all'interno di un Web server. Copiamo quindi il pacchetto all'interno del nostro Web server e creiamo un nuovo file che fungerà da punto d'ingresso (es. index.php
):
<?php
require "exampleapp.phar";
A questo punto aprendo il file da browser (es http://localhost/index.php) otterremo la stessa stringa ottenuta da riga di comando:
Questa è la mia applicazione compressa con PHAR
Codice completo
Il codice completo dell'esempio è disponibile su GitHub. Sulla destra è presente un pulsante Clone or download con cui è possibile scaricare un file ZIP pronto all'uso.