W3docs

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
ParametroDescrizione
$filenamePercorso 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.

php— editable, runs on the server

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 line

Verifica 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 $filename non è valido in un modo che PHP non riesce a risolvere (ad es. una violazione di open_basedir), PHP può emettere un E_WARNING. Il valore di ritorno rimane false. 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. Chiama clearstatcache() prima di ri-verificare per costringere PHP a rileggere il filesystem.
  • false è ambiguo. Un risultato false significa "non scrivibile o non esistente." Se hai bisogno di distinguere i due casi, combinalo con file_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.

Practice

Pratica
Cosa fa la funzione is_writable() in PHP?
Cosa fa la funzione is_writable() in PHP?
Was this page helpful?