is_readable()
La funzione is_readable() è una funzione PHP integrata che verifica se un file è leggibile, restituendo true se leggibile e false altrimenti.
La funzione is_readable() indica se PHP può leggere un determinato file o directory prima di tentare di aprirlo. Controlla che il percorso esista e che il processo corrente abbia il permesso di lettura su di esso. Chiamarla prima consente di gestire gli errori in modo elegante anziché generare un avviso di runtime da fopen() o file_get_contents().
Questo capitolo tratta la sintassi, il valore restituito, un esempio eseguibile, i problemi più comuni (caching, permessi, race condition) e come is_readable() si relaziona alle altre funzioni del filesystem PHP.
Sintassi
is_readable(string $filename): bool| Parte | Significato |
|---|---|
$filename | Percorso del file o della directory da verificare. Può essere assoluto (/var/www/data.txt) o relativo alla directory di lavoro dello script. |
| Restituisce | true se il percorso esiste ed è leggibile dall'utente/processo corrente, false altrimenti. |
is_readable() funziona anche sulle directory: restituisce true quando la directory può essere aperta ed elencata.
Esempio di base
La funzione restituisce un valore boolean, quindi si legge naturalmente all'interno di una condizione if: si sceglie il ramo in base alla possibilità di leggere il file senza mai aprirlo.
Un esempio completo ed eseguibile
L'esempio precedente punta a un percorso che potrebbe non esistere. Ecco una versione che puoi eseguire ovunque — crea un file, lo verifica, poi verifica un percorso che non esiste:
<?php
// Create a temp file we know is readable.
$file = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($file, 'hello');
var_dump(is_readable($file)); // bool(true)
var_dump(is_readable('/no/such/file')); // bool(false)
unlink($file); // clean upLa prima chiamata è true perché il file esiste e l'abbiamo appena creato con i nostri permessi; la seconda è false perché il percorso non esiste affatto.
Proteggere una lettura di file
L'utilizzo tipico nel mondo reale è una protezione prima della lettura, in modo che un file mancante o non leggibile non emetta un avviso:
<?php
$path = 'config.json';
if (!is_readable($path)) {
// Handle the problem your way: log, default, or throw.
throw new RuntimeException("Cannot read config file: $path");
}
$config = json_decode(file_get_contents($path), true);Problemi comuni
- I risultati vengono memorizzati nella cache. PHP memorizza nella cache le informazioni stat per ogni richiesta. Se modifichi i permessi di un file durante la stessa esecuzione dello script, chiama
clearstatcache()prima di controllare di nuovo, altrimenti potresti ottenere una risposta obsoleta. truenon è una garanzia. I permessi possono cambiare tra il controllo e la lettura effettiva (una race condition time-of-check to time-of-use). Per il codice critico, è meglio tentare direttamente la lettura e gestire l'errore, piuttosto che affidarsi esclusivamente ais_readable().- Restituisce
falseper i percorsi inesistenti — senza avvisi. Quindiis_readable()funge anche da controllo "esiste e posso leggerlo". Per verificare l'esistenza indipendentemente dai permessi, usafile_exists(). - I permessi vengono valutati per l'utente del server web (spesso
www-data), non per l'utente della shell, quando lo script viene eseguito sotto un server web.
Funzioni correlate
is_writable()— la controparte per il permesso di scrittura.is_file()— verifica che il percorso sia un file regolare (non una directory).file_exists()— verifica l'esistenza, ignorando il permesso di lettura.fopen()efile_get_contents()— le funzioni che tipicamente si proteggono conis_readable().
Conclusione
is_readable() è un modo leggero e privo di effetti collaterali per verificare che un percorso esista e possa essere letto prima di aprirlo. Usala come protezione per gestire gli errori in modo elegante, ricorda che i suoi risultati vengono memorizzati nella cache all'interno di una richiesta, e per il codice critico per la sicurezza tenta la lettura e gestisci gli errori anziché fidarti solo del controllo.