In breve: la PHP CLI (Command Line Interface) è la variante di PHP per la riga di comando. Esegue script senza server web, ad esempio per cronjob, Composer o attività di manutenzione. Ha valori predefiniti propri, spesso un php.ini proprio e a volte perfino una versione diversa da quella del sito web. Per questo php -v non è una prova affidabile che il sito sia stato aggiornato dopo PHP2Shell.
Che cos'è la PHP CLI?
Il manuale PHP indica due principali ambiti d'uso di PHP: script per siti web e script da riga di comando. Per questi ultimi esiste una SAPI propria di nome cli. Non richiede né server web né browser, solo l'interprete PHP. Secondo il manuale è particolarmente adatta ad attività eseguite regolarmente tramite cron su Linux o la pianificazione attività su Windows.
Esempi tipici nella vita aziendale: importazioni notturne nello shop, invio di newsletter, pulizia delle cache, aggiornamenti tramite Composer o gli strumenti a riga di comando dei CMS come WP-CLI o la console di Symfony. Su Windows il file si chiama php.exe, la variante CGI php-cgi.exe.
A differenza di PHP-FPM, la CLI non è un servizio. Ogni chiamata avvia un nuovo processo, rilegge secondo il manuale la configurazione e termina quando lo script è finito. Un riavvio dopo un aggiornamento non è quindi necessario. Fanno eccezione i processi di lunga durata avviati tramite CLI, ad esempio i worker delle code dei framework o i daemon sotto systemd o Supervisor. Girano per giorni con l'interprete caricato una volta e dopo un aggiornamento di PHP vanno riavviati come i worker web.
Per la direzione e i responsabili di progetto significa: anche le attività in background vanno nell'inventario e in ogni piano di aggiornamento.
In che cosa la CLI differisce dalla versione web?
Secondo il manuale la CLI sovrascrive in modo fisso alcune impostazioni. Non si possono modificare tramite php.ini, solo a runtime con ini_set():
| Direttiva | Valore nella CLI | Motivazione secondo il manuale |
|---|---|---|
html_errors |
disattivato | i tag HTML disturbano nel terminale |
implicit_flush |
attivato | l'output deve comparire subito |
max_execution_time |
0 (illimitato) | gli script da riga di comando girano spesso a lungo |
register_argc_argv |
attivato | gli script ricevono sempre $argc e $argv |
output_buffering |
disattivato | cablato in modo fisso, le funzioni di buffer restano utilizzabili |
max_input_time |
disattivato | la CLI non conosce GET, POST o upload |
Un'altra differenza: la CLI non passa alla directory dello script. Chi chiama php -f ordner/skript.php da /tmp continua a lavorare in /tmp. I percorsi relativi nei cronjob sono perciò una fonte frequente di errori.
Un piccolo script che deve girare solo da riga di comando:
<?php
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Nur für die Kommandozeile.');
}
$tage = (int) ($argv[1] ?? 30);
$grenze = time() - $tage * 86400;
$alt = 0;
foreach (glob(__DIR__ . '/cache/*.tmp') ?: [] as $datei) {
if (filemtime($datei) < $grenze) { $alt++; }
}
fwrite(STDOUT, "Dateien älter als $tage Tage: $alt\n");
Il controllo su PHP_SAPI impedisce che uno script di manutenzione venga attivato tramite il browser, se per errore si trova nella directory web. Il manuale raccomanda espressamente di verificare così la SAPI invece di affidarsi alla presenza di $argv.
Le opzioni più importanti della PHP CLI
Le opzioni seguenti provengono dal quadro delle opzioni del manuale PHP e sono particolarmente utili per gli amministratori:
php -vmostra il numero di versione della CLI.php --inimostra quali file di configurazione vengono caricati.php -melenca i moduli compilati e caricati.php -irichiamaphpinfo()e ne emette il risultato come testo.php -l datei.phpverifica solo la sintassi (lint). Da PHP 8.3 anche per più file in una volta.php -r 'code'esegue il codice direttamente, senza<?php.php -d name=wertimposta un'impostazione INI per questa chiamata.php -nignora completamente il php.ini.php --ri namemostra la configurazione di un'estensione.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Il server web integrato: solo per lo sviluppo
Con php -S localhost:8000 la CLI avvia un piccolo server web. L'output di esempio nel manuale indica PHP 5.4.0 come punto di partenza. Il manuale è inequivocabile: il server serve allo sviluppo, non è un server web completo e non dovrebbe girare in reti pubbliche né in produzione. Se gira in modo permanente su un server ed è raggiungibile dall'esterno, è un riscontro da eliminare.
CLI, cron e sicurezza dopo PHP2Shell
Le segnalazioni note su PHP2Shell citano PHP-FPM, mod_php, php-cgi, FrankenPHP e LiteSpeed come modalità di esecuzione interessate. La CLI non elabora richieste dalla rete. Per la sicurezza è comunque importante sotto tre aspetti:
- Prova sbagliata:
php -vmostra la versione della CLI. Il sito web può usare un'altra versione e i backport delle distribuzioni spesso non cambiano il numero visualizzato. Come documentare correttamente lo stato lo spiegano Verificare versione e stato delle patch di PHP e l'articolo Perché php -v mostra lo stesso numero. - Persistenza tramite cron: dopo un'intrusione gli aggressori usano volentieri cronjob che avviano regolarmente uno script PHP. Indicazioni per la ricerca sono in Riconoscere i cronjob nascosti usati come backdoor.
- Stesso pacchetto: la CLI proviene di solito dallo stesso repository di pacchetti di PHP-FPM e va inclusa nell'aggiornamento.
Come aiuta concretamente PHP SOS?
- Confrontare le versioni: confrontiamo lo stato di CLI e web e documentiamo quale versione il Suo sito web consegna davvero.
- Verificare i cronjob: elenchiamo tutte le attività PHP pianificate di tutti gli utenti e le assegniamo alle rispettive applicazioni.
- Mettere in sicurezza la manutenzione: spostiamo gli script di manutenzione fuori dalla directory web e inseriamo controlli sulla SAPI.
- Seguire nel tempo: nel contratto di manutenzione della sicurezza manteniamo aggiornati insieme CLI, SAPI web e cronjob.
Domande frequenti
php -v mostra la versione del mio sito web?
Non necessariamente. php -v mostra la versione della variante a riga di comando. Il sito web può girare con un'altra versione di PHP-FPM o con un modulo Apache. Per il sito conta lo stato della SAPI web, che si accerta tramite il servizio o un file di verifica temporaneo.
Perché gli script CLI girano senza limiti di tempo?
Secondo il manuale PHP la CLI imposta max_execution_time in modo fisso a 0, cioè illimitato, perché gli script da riga di comando svolgono spesso compiti lunghi. La durata si può limitare tramite lo script stesso o strumenti come timeout.
Posso usare il server web integrato php -S in produzione?
No. Il manuale lo descrive come supporto allo sviluppo, non come server web completo, e ne sconsiglia l'uso in reti pubbliche e in produzione. Per i sistemi live servono Apache, Nginx o LiteSpeed con PHP-FPM davanti.
OPcache è attiva da riga di comando?
Per impostazione predefinita no. Secondo il manuale opcache.enable_cli è impostato su 0. Per script brevi la cache serve comunque poco, perché ogni chiamata è un nuovo processo.