W3docs

fileowner()

La funzione fileowner() di PHP restituisce l'ID utente numerico del proprietario di un file, con esempi pratici e note sulle cache.

La funzione fileowner() è una funzione built-in di PHP che restituisce il proprietario di un file come ID utente (UID) numerico — lo stesso UID che il sistema operativo memorizza nei metadati del file. È l'equivalente PHP del guardare la colonna del proprietario con ls -l. Questa pagina illustra la sintassi, i valori restituiti, il problema comune dei risultati in cache non aggiornati e come convertire l'UID numerico in un nome utente leggibile.

Sintassi

fileowner(string $filename): int|false
  • $filename — il percorso del file (o della directory) da ispezionare. Può essere relativo o assoluto.
  • Restituisce l'ID utente del proprietario come int in caso di successo, oppure false in caso di errore (ad esempio, se il file non esiste o lo script non ha i permessi per leggerne i metadati).

Poiché un UID valido può essere 0 (l'utente root sui sistemi Unix), confronta sempre il risultato con l'operatore di uguaglianza stretta === false anziché un controllo di verità generico — altrimenti un file perfettamente valido di proprietà di root sembrerebbe un errore.

Esempio di base

<?php

$filename = __FILE__; // inspect the running script itself

$owner_id = fileowner($filename);

if ($owner_id === false) {
    echo "Failed to get the owner of the file.";
} else {
    echo "The owner of '$filename' has user ID $owner_id.";
}

Un possibile output è:

The owner of '/var/www/example.php' has user ID 33.

Il numero esatto dipende da quale account del sistema operativo ha creato o possiede il file (ad esempio, 33 è l'utente predefinito www-data su molti sistemi Debian/Ubuntu).

Convertire l'UID in un nome utente

Un numero grezzo è raramente ciò che si vuole mostrare a un utente. Sui sistemi Unix con l'estensione POSIX abilitata, passa l'UID a posix_getpwuid() per ottenere i dettagli dell'account:

<?php

$uid = fileowner(__FILE__);

if ($uid !== false && function_exists('posix_getpwuid')) {
    $info = posix_getpwuid($uid);
    echo "Owner: {$info['name']} (UID {$uid})";
} else {
    echo "Owner UID: " . var_export($uid, true);
}

Questo stampa qualcosa come Owner: www-data (UID 33). L'estensione POSIX non è disponibile su Windows, quindi proteggi la chiamata con function_exists() come mostrato.

Attenzione ai risultati in cache

PHP memorizza nella cache i risultati delle funzioni basate su stat (fileowner(), fileperms(), filegroup(), filesize() e simili) per motivi di prestazioni. Se il proprietario del file cambia durante la stessa esecuzione dello script — ad esempio dopo una chiamata a chown()fileowner() potrebbe restituire il valore precedente. Cancella prima la cache con clearstatcache():

<?php

$file = 'report.txt';

chown($file, 'nobody');     // change ownership
clearstatcache();           // discard the stale stat cache
$uid = fileowner($file);    // now reflects the new owner

Note e avvertenze

  • Windows: il concetto di proprietario POSIX numerico non si applica correttamente agli ACL di Windows. fileowner() restituisce tipicamente 0, quindi non fare affidamento su di essa per la logica dei permessi su Windows.
  • false vs. 0: 0 è root (un proprietario reale); false indica che la chiamata ha fallito. Usa ===.
  • Hai bisogno di più del proprietario? stat() restituisce l'intero array di metadati (dimensione, modalità, proprietario, gruppo, timestamp) in una sola chiamata, che è più efficiente rispetto a chiamare separatamente più funzioni file*().
  • Verifica l'accesso prima: se hai solo bisogno di sapere se puoi leggere un file, is_readable() è lo strumento giusto — fileowner() risponde a una domanda diversa.

Conclusione

fileowner() è una funzione piccola ma utile per leggere il proprietario numerico di un file in PHP. Confronta il risultato con === false, ricorda che 0 è un proprietario valido (root), chiama clearstatcache() dopo aver cambiato la proprietà e usa posix_getpwuid() quando hai bisogno del nome utente leggibile. Su Windows il risultato non è significativo, quindi riserva la logica basata sul proprietario ai sistemi Unix.

Esercizio

Pratica
Qual è lo scopo della funzione fileowner() in PHP?
Qual è lo scopo della funzione fileowner() in PHP?
Was this page helpful?