W3docs

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, usa chmod(). 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

ParametroTipoDescrizione
$filenamestringIl percorso del file o della directory di destinazione.
$userstring | intIl 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à false a 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 false per 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, usa lchown().
  • Non ricorsiva. Le directory richiedono un'iterazione manuale (Esempio 4).
  • open_basedir / disable_functions. Molti host disabilitano chown() per motivi di sicurezza; controlla php.ini se 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().

Pratica

Pratica
Qual è lo scopo della funzione 'chown' in PHP?
Qual è lo scopo della funzione 'chown' in PHP?
Was this page helpful?