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
intin caso di successo, oppurefalsein 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 ownerNote e avvertenze
- Windows: il concetto di proprietario POSIX numerico non si applica correttamente agli ACL di Windows.
fileowner()restituisce tipicamente0, quindi non fare affidamento su di essa per la logica dei permessi su Windows. falsevs.0:0èroot(un proprietario reale);falseindica 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ù funzionifile*(). - 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.