Come testare rapidamente i siti Web con il server Web integrato di PHP

Pubblicato: 2022-08-11

Illustrazione che mostra il logo PHP

Hai bisogno di avviare rapidamente un server web per testare un'applicazione PHP? L'interprete PHP ne ha uno integrato! Puoi usarlo per ispezionare rapidamente il tuo lavoro senza eseguire Apache, NGINX o una soluzione di containerizzazione.

Il server integrato di PHP riceve relativamente poca attenzione ma è abbastanza potente per scopi di sviluppo. In questa guida mostreremo come utilizzarlo come alternativa ad altri micro-server come SimpleHTTPServer di Python o il pacchetto http-server npm, nessuno dei quali può eseguire script PHP.

Utilizzo del server integrato

Il server integrato è un comodo meccanismo per aiutarti a testare i siti PHP in ambienti privi di un vero e proprio server HTTP. È disponibile in PHP 5.4 e tutte le versioni successive. Puoi eseguirlo direttamente dalla tua directory di lavoro senza dover prima configurare un host virtuale.

Prima di utilizzare il server, tieni presente che è progettato solo per uso di sviluppo. La documentazione PHP mette esplicitamente in guardia contro la distribuzione di questo server davanti alle applicazioni di produzione. Non è sufficientemente sicuro per essere esposto su reti pubblicamente accessibili.

Avvio del server

Il server viene avviato passando il flag -S all'eseguibile php :

 $ php -S host locale: 8080
[Ven Jun 10 16:00:00 2022] Server di sviluppo PHP 8.1.5 (http://localhost:8080) avviato

L'argomento fornito al comando specifica l'indirizzo di ascolto del server. Abbiamo usato la porta 8080 su localhost nell'esempio sopra. Ora puoi visitare http://localhost:8080 nel tuo browser web per accedere al contenuto nella tua directory di lavoro. Tutti gli script PHP verranno eseguiti automaticamente quando li richiedi.

Puoi servire un percorso che è al di fuori della tua directory di lavoro impostando il flag -t quando avvii il server:

 $ php -S localhost:8080 -t /home/$USER/public_docs

La radice del documento sarà ora /public_docs all'interno della tua cartella Inizio.

Tieni aperta la finestra del terminale mentre utilizzi il server web. Premi Ctrl+C per terminare il processo una volta terminato il test del tuo sito. PHP registrerà ogni richiesta in arrivo nella finestra del tuo terminale, inclusi il metodo URI e HTTP. Eventuali errori PHP non rilevati verranno visualizzati anche nei registri.

Abilitazione dell'accesso remoto

L'ascolto su localhost non consentirà connessioni in entrata da altri dispositivi sulla rete. Puoi consentire l'accesso remoto collegandoti a 0.0.0.0 invece:

 $ php -S 0.0.0.0:8080

Ricorda che il server non è protetto per l'uso in produzione e non dovrebbe essere esposto pubblicamente. Consenti l'accesso remoto solo quando è assolutamente necessario, ad esempio durante il test di una particolare funzionalità su un dispositivo mobile. Assicurati che la porta che usi non sia aperta a Internet.

Richiedi abbinamento di riserva

PHP cercherà i file index.php e index.html nella radice del documento attivo quando la richiesta in arrivo non ha un componente URI. Se nessuno di questi file esiste, il server continuerà a spostarsi verso l'alto nell'albero delle directory, cercando un indice in uno dei genitori della radice del documento. Ciò significa che puoi finire involontariamente per offrire contenuti che si trovano al di fuori della directory che hai specificato. Lo stato 404 Non trovato verrà emesso quando viene raggiunta la cima dell'albero senza che sia stato trovato un file di indice.

Le richieste che includono un URI (come /file ) devono corrispondere esattamente a un file statico nella radice del documento. In caso contrario verrà restituito un 404. PHP imposta automaticamente l'intestazione della risposta Content-Type sul tipo MIME del file servito per le estensioni di file più popolari.

Utilizzo di uno script router

È possibile opzionalmente configurare il server Web per chiamare uno script su ogni richiesta. Ciò consente di utilizzare il front controller dell'applicazione per eseguire il routing dinamico avanzato.

La funzionalità del router viene abilitata fornendo un nome file PHP sulla riga di comando all'avvio del server:

 $ php -S host locale: 8080 router.php

PHP ora utilizzerà router.php per gestire ogni richiesta in arrivo. Puoi indirizzare gli utenti al punto appropriato della tua applicazione esaminando l'URI della richiesta:

 if ( $_SERVER [ "RICHIESTA_URI" ] === "/dashboard" ) {
    require_once ( "dashboard.php" ) ;
}
altrimenti se ( $_SERVER [ "RICHIESTA_URI" ] === "/profilo" ) {
    require_once ( "profile.php" ) ;
}
altro {
    require_once ( "404.php" ) ;
}

L'output prodotto dallo script del router diventerà la risposta inviata al client. Un'eccezione è se lo script restituisce false : in questo caso, PHP eseguirà il fallback per restituire il file statico che corrisponde all'URI della richiesta originale.

 if ( str_starts_with ( $_SERVER [ "RICHIESTA_URI" ] , "/api" ) ) {
    // Instrada all'endpoint API corretto
    // ...
}
altro {
    // Serve staticamente altri percorsi
    restituisce falso ;
}

Rilevamento del server integrato dal codice PHP

Il tuo codice PHP può rilevare se viene chiamato dal server web integrato controllando il nome dell'interfaccia attiva. La funzione php_sapi_name() fornisce questo valore. Verrà impostato su cli-server quando lo script è stato invocato dal componente server integrato.

 if ( php_sapi_name ( ) === "cli-server" ) {
    enable_development_mode ( ) ;
}

Gestione di più richieste contemporaneamente

Per impostazione predefinita, il server viene eseguito in modalità sincrona a processo singolo. Le richieste vengono gestite individualmente e si bloccano a vicenda dall'esecuzione fino al completamento. Questo è uno dei motivi per cui il server non è adatto per l'uso in produzione.

PHP 7.4 ha aggiunto il supporto per la gestione di più richieste contemporaneamente. Si basa sulla disponibilità di fork() e non funziona su Windows. Il server eseguirà il fork di un nuovo lavoratore per soddisfare ogni richiesta in arrivo quando questa modalità è abilitata. Puoi attivarlo impostando la variabile di ambiente PHP_CLI_SERVER_WORKERS sul numero di lavoratori che desideri:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

Questa funzionalità è ancora contrassegnata come sperimentale in PHP 8.1.

Riepilogo

PHP ha un server web integrato che è un modo conveniente per testare le tue applicazioni ed esporre rapidamente il contenuto del filesystem locale sulla tua rete locale. Supporta l'esecuzione di script PHP, il routing catch-all e i file statici con i tipi MIME più comuni.

Sebbene il server ora supporti una modalità di fork opzionale, non è consigliabile utilizzarla in produzione. È inteso come un aiuto allo sviluppo e manca delle funzionalità di personalizzazione e sicurezza necessarie per le tue distribuzioni pubbliche. Dove eccelle è come alternativa leggera e integrata alle piattaforme di sviluppo convenzionali come i container WAMP, XAMPP e Docker.