is_writeable()
La funzione is_writable() di PHP verifica se un file o una directory è scrivibile, restituendo true o false.
Cosa fa la funzione is_writable()
La funzione is_writable() è una funzione built-in di PHP che verifica se un determinato percorso esiste e può essere scritto dal processo corrente. Funziona sia per i file che per le directory. Restituisce true quando il percorso esiste ed è scrivibile, e false in caso contrario — incluso quando il percorso non esiste affatto.
Questa pagina tratta la sintassi, il valore di ritorno, gli usi pratici più comuni e le insidie (caching, symlink, root e l'alias deprecato is_writeable()) che possono causare problemi.
is_writeable() vs is_writable()
is_writeable() (con la e aggiuntiva) è un vecchio alias di is_writable(). È stato deprecato in PHP 5.0.0 e rimosso in PHP 8.0.0, dove chiamarlo ora genera un Error fatale. Utilizza sempre la grafia canonica is_writable() nel codice moderno.
Sintassi
is_writable(string $filename): bool| Parametro | Descrizione |
|---|---|
$filename | Il percorso del file o della directory da verificare. Può essere relativo (risolto rispetto alla directory di lavoro corrente) o assoluto. |
Valore di ritorno: true se $filename esiste ed è scrivibile, altrimenti false. Un percorso inesistente restituisce false anziché generare un errore.
Esempio di base
La funzione restituisce un boolean, quindi si inserisce direttamente in una condizione if. In questo caso il messaggio dipende dal fatto che il processo che esegue lo script abbia il permesso di scrittura su /path/to/file.
Un pattern di scrittura sicuro
L'uso più comune è proteggere una scrittura in modo che lo script fallisca in modo controllato anziché bloccarsi con un avviso sui permessi:
<?php
$logFile = __DIR__ . '/app.log';
if (is_writable($logFile)) {
file_put_contents($logFile, "Started at " . date('c') . "\n", FILE_APPEND);
echo "Log entry written.";
} else {
echo "Cannot write to $logFile — check permissions.";
}Si noti che is_writable() verifica un percorso esistente. Se il file non esiste ancora, di solito è meglio testare la directory che lo conterrà, perché la creazione di un nuovo file richiede il permesso di scrittura sulla directory padre:
<?php
$target = __DIR__ . '/cache/data.json';
if (is_writable(dirname($target))) {
file_put_contents($target, '{}');
echo "File created.";
} else {
echo "The cache directory is not writable.";
}Cose a cui prestare attenzione
- I risultati vengono memorizzati nella cache. PHP memorizza i metadati del filesystem tramite la stat cache. Se si modificano i permessi durante uno script (ad esempio con
chmod()) e si riverifica lo stesso percorso, chiamare primaclearstatcache()per ottenere un risultato aggiornato. - Testa il proprietario del processo, non il tuo login. Un percorso scrivibile nel terminale potrebbe non essere scrivibile per l'utente del web server (
www-data,nginx, ecc.) che esegue effettivamente PHP. - Esecuzione come root. Il superutente può scrivere quasi ovunque, quindi
is_writable()potrebbe restituiretrueanche su file contrassegnati come sola lettura. Non fare affidamento su di essa come confine di sicurezza. - I symlink vengono seguiti. La verifica si applica alla destinazione di un collegamento simbolico, non al collegamento stesso.
- Race condition (TOCTOU). Un percorso può diventare non scrivibile tra la verifica e la scrittura effettiva. Per scritture critiche, è preferibile tentare la scrittura e gestire l'errore piuttosto che fare affidamento solo sulla verifica.
<?php
chmod('/tmp/example.txt', 0644);
var_dump(is_writable('/tmp/example.txt')); // may show stale value
clearstatcache(); // refresh the stat cache
var_dump(is_writable('/tmp/example.txt')); // now reflects the new permissionsFunzioni correlate
is_readable()— verifica se un percorso può essere letto.file_exists()— verifica solo che un percorso esista.is_file()eis_dir()— distinguono i file dalle directory.chmod()— modifica i permessi di un percorso.file_put_contents()efwrite()— le operazioni di scrittura che tipicamente si proteggono conis_writable().
Conclusione
is_writable() consente di verificare, prima di scrivere, se un file o una directory può essere scritto dal processo corrente — restituendo false per i percorsi mancanti anziché generare un'eccezione. Ricordare di verificare la directory padre quando si creano nuovi file, di chiamare clearstatcache() dopo aver modificato i permessi durante l'esecuzione dello script, e di usare la grafia canonica poiché is_writeable() è stata rimossa in PHP 8.