is_writable()
PHP is_writable() restituisce true se un file o directory è scrivibile dal processo corrente. Sintassi, avvertenze e la cache delle stat.
La funzione PHP is_writable() indica, prima di tentare la scrittura, se il processo corrente è autorizzato a scrivere su un determinato file o directory. Questa pagina ne illustra la sintassi, il valore di ritorno, il comportamento di caching che crea problemi e i pattern pratici per utilizzarla in modo sicuro.
Cos'è la funzione is_writable()?
is_writable() è una funzione PHP integrata che restituisce true se il file (o la directory) indicato esiste ed è scrivibile dall'utente con cui gira il processo PHP, e false in caso contrario. La funzione accetta un solo argomento e non esegue alcuna scrittura: si limita a verificare i permessi.
Il controllo si basa sull'ID utente effettivo del processo in esecuzione (ad esempio www-data con Apache/Nginx-FPM), non sull'utente proprietario dello script. Un file modificabile nel proprio editor potrebbe comunque risultare non scrivibile per il server web.
is_writable() ha un alias, is_writeable() (con una e in più); i due sono identici.
Sintassi
is_writable(string $filename): bool| Parametro | Descrizione |
|---|---|
$filename | Percorso del file o della directory da verificare. Può essere relativo alla directory di lavoro corrente. |
Restituisce true in caso di successo, false se il percorso non è scrivibile o non esiste.
Come usare la funzione is_writable()
Il pattern tipico è "controlla prima di agire" — verificare che un file sia scrivibile prima di tentare di aprirlo in scrittura, così da poter fallire con un messaggio chiaro invece di generare un avviso a runtime.
Poiché il sandbox del runner crea data.txt, l'esempio precedente stampa The file 'data.txt' is writable.
Un esempio completo ed eseguibile
Questo script autonomo crea un file, lo verifica e scrive solo se il controllo ha esito positivo:
<?php
$file = 'log.txt';
// Create the file so the example is reproducible.
file_put_contents($file, "first line\n");
if (is_writable($file)) {
file_put_contents($file, "second line\n", FILE_APPEND);
echo "Wrote to $file:\n";
echo file_get_contents($file);
} else {
echo "Cannot write to $file.";
}Output:
Wrote to log.txt:
first line
second lineVerifica di una directory
is_writable() funziona anche con le directory. Questo è il controllo corretto prima di creare un nuovo file: non puoi verificare il file (non esiste ancora), quindi verifichi la cartella che lo conterrà.
<?php
$dir = __DIR__; // the directory this script lives in
if (is_writable($dir)) {
echo "New files can be created in: $dir";
} else {
echo "Directory is read-only: $dir";
}Problemi comuni
- Non lancia eccezioni — emette avvisi. Se
$filenamenon è valido in un modo che PHP non riesce a risolvere (ad es. una violazione di open_basedir), PHP può emettere unE_WARNING. Il valore di ritorno rimanefalse. Usa@per sopprimerlo solo come ultima risorsa. - I risultati possono essere in cache. PHP mantiene una stat cache. Se i permessi di un file cambiano durante la stessa esecuzione dello script,
is_writable()può restituire un risultato non aggiornato. Chiamaclearstatcache()prima di ri-verificare per costringere PHP a rileggere il filesystem. falseè ambiguo. Un risultatofalsesignifica "non scrivibile o non esistente." Se hai bisogno di distinguere i due casi, combinalo confile_exists().- Race condition TOCTOU. Tra il controllo
is_writable()e la scrittura effettiva, i permessi del file potrebbero cambiare. Per il codice critico, non affidarti solo al controllo — gestisci anche l'eventuale fallimento della scrittura stessa.
Quando si modificano i permessi nel mezzo di uno script e si ri-verifica, svuota prima la cache:
<?php
$file = 'config.ini';
file_put_contents($file, "data\n");
var_dump(is_writable($file)); // bool(true)
chmod($file, 0444); // make it read-only
clearstatcache(); // force PHP to re-read the filesystem
var_dump(is_writable($file)); // bool(false)Output:
bool(true)
bool(false)Funzioni correlate
is_readable()— la controparte per i permessi di lettura.file_exists()— verifica l'esistenza senza controllare i permessi.is_file()— conferma che un percorso sia un file normale.fopen()/fwrite()— aprire e scrivere su file una volta superato il controllo.chmod()— modifica i bit di permesso di un file.
Conclusione
is_writable() consente allo script di verificare in anticipo l'accesso in scrittura e di fallire in modo controllato invece di generare avvisi a runtime. Ricorda le sue tre peculiarità: riflette i permessi dell'utente del processo, false significa anche "mancante" e i risultati sono in cache fino alla chiamata di clearstatcache(). Abbinalo alla gestione degli errori della scrittura effettiva per un codice robusto nella gestione dei file.