chown()
La funzione chown() in PHP cambia il proprietario di un file o directory. Fondamentale per amministratori e sviluppatori web.
La funzione PHP chown()
La funzione chown() cambia il proprietario di un file o di una directory. Nei sistemi Unix-like, ogni file ha un utente proprietario e un gruppo proprietario; chown() aggiorna l'utente. Viene utilizzata principalmente da amministratori di server e script di deployment che necessitano che un file appartenga a un determinato account di sistema — ad esempio, per assegnare un file caricato all'utente del web server in modo che possa essere servito o ruotato.
Questa pagina tratta la sintassi, i parametri, il valore di ritorno, i permessi necessari per il suo funzionamento, gli errori comuni e alcuni esempi pratici.
Il proprietario è l'utente, non il gruppo. Per cambiare il gruppo proprietario, usa
chgrp(). Per cambiare i permessi di lettura/scrittura/esecuzione, usachmod(). Queste tre funzioni vengono spesso confuse.
Sintassi
chown(string $filename, string|int $user): bool$filename— percorso del file o della directory di cui si vuole cambiare il proprietario.$user— il nuovo proprietario, specificato come string con il nome utente (es."www-data") oppure come ID utente numerico (UID, es.33).
Restituisce true in caso di successo e false in caso di errore.
Parametri
| Parametro | Tipo | Descrizione |
|---|---|---|
$filename | string | Il percorso del file o della directory di destinazione. |
$user | string | int | Il nuovo proprietario. Una string viene interpretata come nome utente; un integer viene interpretato come UID. |
Passare una string con il nome utente richiede a PHP di risolverla in un UID, quindi l'utente deve esistere nel database utenti del sistema. Passare l'UID direttamente evita questa ricerca.
Valore di ritorno
chown() restituisce un boolean:
true— il proprietario è stato cambiato con successo.false— la modifica è fallita (file mancante, privilegi insufficienti o l'utente specificato non esiste). Viene emesso anche un avviso.
Verificare sempre il valore di ritorno invece di assumere il successo:
<?php
if (chown("example.txt", "www-data")) {
echo "Owner changed successfully.";
} else {
echo "Could not change owner.";
}Chi può chiamare chown()?
Questo è il motivo più comune per cui chown() "non funziona":
- Su Unix, solo il superutente (root) può cambiare il proprietario di un file. Un processo normale senza privilegi di root non può assegnare un file a un altro utente.
- Pertanto, in un tipico ambiente di hosting condiviso o con PHP-FPM standard,
chown()restituiràfalsea meno che il processo PHP non venga eseguito come root — il che di solito non dovrebbe accadere. chown()non è disponibile su Windows nel senso tradizionale e si comporta come un'operazione nulla.
Se hai bisogno solo di controllare l'accesso anziché la proprietà, preferisci
chmod(), che il proprietario del file può chiamare senza privilegi di root.
Esempi
Esempio 1: Impostare il proprietario tramite nome utente
Impostare il proprietario di example.txt all'utente www-data:
<?php
$file = "example.txt";
if (chown($file, "www-data")) {
echo "Owner of {$file} set to www-data.";
} else {
echo "Failed to change owner of {$file}.";
}Esempio 2: Impostare il proprietario tramite UID
Se si conosce l'ID utente numerico, è possibile passarlo direttamente. Qui 1000 è un UID tipico per il primo utente non di sistema:
<?php
chown("example.txt", 1000);Esempio 3: Leggere il proprietario con fileowner()
Dopo aver cambiato il proprietario, è possibile verificare il risultato. fileowner()
restituisce l'UID e (sui sistemi con l'estensione POSIX) posix_getpwuid()
converte quell'UID in un nome:
<?php
$file = "example.txt";
chown($file, "www-data");
clearstatcache(); // owner info is cached — clear it before re-reading
$uid = fileowner($file); // e.g. 33
$info = posix_getpwuid($uid); // ["name" => "www-data", ...]
echo "Owner UID: {$uid}\n";
echo "Owner name: {$info['name']}\n";clearstatcache() è importante qui: PHP memorizza nella cache i dati di stato del file, quindi senza di essa potresti leggere il proprietario precedente. Consulta clearstatcache() per i dettagli.
Esempio 4: Cambiare la proprietà di una directory
chown() funziona anche sulle directory, ma non è ricorsiva — influisce solo sulla voce della directory stessa, non sui file al suo interno. Per cambiare la proprietà di un intero albero, è necessario iterare sul suo contenuto:
<?php
$dir = "/var/www/uploads";
chown($dir, "www-data"); // the directory only
foreach (new DirectoryIterator($dir) as $item) {
if (!$item->isDot()) {
chown($item->getPathname(), "www-data");
}
}Errori comuni
- Restituisce
falseper i processi non-root. Questo è per progettazione — solo root può riassegnare la proprietà. - Dati del proprietario memorizzati in cache. Chiama
clearstatcache()prima di rileggere le informazioni sul proprietario dopo una modifica. - I link simbolici vengono seguiti.
chown()cambia la destinazione del link. Per modificare il link simbolico stesso, usalchown(). - Non ricorsiva. Le directory richiedono un'iterazione manuale (Esempio 4).
open_basedir/disable_functions. Molti host disabilitanochown()per motivi di sicurezza; controllaphp.inise fallisce silenziosamente.
Funzioni correlate
chgrp()— cambia il gruppo proprietario di un file.chmod()— cambia i permessi del file (lettura/scrittura/esecuzione).fileowner()— ottiene l'UID del proprietario di un file.filegroup()— ottiene il GID del gruppo di un file.lchown()— cambia il proprietario di un link simbolico stesso.clearstatcache()— cancella i dati di stato del file memorizzati nella cache di PHP.
Conclusione
La funzione chown() cambia il proprietario di un file o di una directory, accettando una string con il nome utente o un UID numerico e restituendo un boolean. L'aspetto fondamentale da ricordare è che cambiare la proprietà richiede privilegi di superutente, motivo per cui spesso restituisce false nel codice web ordinario. Quando hai bisogno solo di controllare l'accesso, usa chmod(); per cambiare il gruppo, usa chgrp().