Distribuire applicazioni PHP con PHAR

2 febbraio 2018

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 classe RecursiveDirectoryIterator 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 file index.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.

Tutte le lezioni

1 ... 47 48 49 ... 66

Se vuoi aggiornamenti su Distribuire applicazioni PHP con PHAR inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Distribuire applicazioni PHP con PHAR

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing