Situazione attuale: PHP2Shell. Due vulnerabilità critiche di PHP (CVSS 9,2) consentono codice dannoso senza autenticazione. Patch dal 21/10/2026.Che cosa fare ora →

PHP dalla riga di comando (CLI)

La CLI di PHP esegue script senza server web, ad esempio per cronjob e manutenzione. Si comporta in modo diverso dalla versione web e spesso non mostra lo stato usato dal Suo sito.

Stato 5 min di letturaConoscere PHP

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:

  1. php -v mostra il numero di versione della CLI.
  2. php --ini mostra quali file di configurazione vengono caricati.
  3. php -m elenca i moduli compilati e caricati.
  4. php -i richiama phpinfo() e ne emette il risultato come testo.
  5. php -l datei.php verifica solo la sintassi (lint). Da PHP 8.3 anche per più file in una volta.
  6. php -r 'code' esegue il codice direttamente, senza <?php.
  7. php -d name=wert imposta un'impostazione INI per questa chiamata.
  8. php -n ignora completamente il php.ini.
  9. php --ri name mostra 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:

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.

Fonti

Contatto immediato

Ogni ora conta. Ci scriva adesso.

Descriva brevemente sistema, versione di PHP e quanto osservato. Ci faremo sentire, chiariremo la situazione e lavoreremo da remoto fino alla chiusura e alla documentazione dell'incidente.

Aiuto immediato