Dans PHP, la fonction Chown est souvent utilisée pour modifier le propriétaire d'un fichier ou d'un répertoire. Ceci est très pratique dans les systèmes Linux / Unix, mais lorsque nous utilisons PHP dans un environnement Windows, le comportement de cette fonction n'est pas aussi clair que prévu. Cet article explorera l'efficacité de la fonction Chown et ses détails de comportement sur le système Windows sous plusieurs angles.
chown (string $ nom de fichier, chaîne | int $ utilisateur): bool
Cette fonction essaie de modifier le propriétaire du fichier spécifié en utilisateur donné. Renvoie vrai en cas de succès, renvoyez false en cas d'échec. Il s'appuie sur le mécanisme de gestion de l'autorisation sous-jacent du système d'exploitation.
Les autorisations des systèmes Windows sont très différentes de celles des systèmes Linux / Unix. Windows utilise ACL (Liste de contrôle d'accès) pour gérer les autorisations de fichiers. Bien que le concept de propriétaire existe, il n'est pas complètement équivalent au concept Chown de Linux. Plus important encore, la gestion des autorisations NTFS de Windows ne permet généralement pas de modifier les propriétaires de fichiers via des appels système en forme de chown , en particulier dans l'environnement d'exécution de PHP.
Lorsque vous utilisez la fonction Chown dans l'environnement Windows, vous rencontrerez généralement les situations suivantes:
Les appels de fonction échouent toujours <br> Les appels directs à Chown renvoient souvent faux , accompagnés d'un avertissement, ce qui invite "l'opération n'est pas prise en charge" ou "les autorisations sont insuffisantes".
Appel non valide, pas d'erreur mais pas de changement au propriétaire <br> Parfois, l'appel de fonction ne rapporte pas d'erreur, mais en fait, le propriétaire du fichier n'a pas changé.
Support limité dans des environnements spécifiques <br> Par exemple, l'utilisation de certains environnements avec des couches de simulation POSIX (telles que Cygwin, WSL, etc.) peut prendre partiellement Chown , mais il s'agit d'une simulation qui repose sur la couche supplémentaire, non originaire des fenêtres.
L'exemple de code PHP suivant montre comment détecter le résultat d' un appel de chown :
<?php
$filename = 'testfile.txt';
// Créer un fichier de test
file_put_contents($filename, 'Tester le contenu');
// Essayez de modifier le propriétaire
$result = chown($filename, 'username');
if ($result) {
echo "La modification du propriétaire a réussi。";
} else {
echo "Le propriétaire n'a pas modifié。";
// Sortir le dernier message d'erreur
var_dump(error_get_last());
}
?>
Sous Windows, ce code est susceptible de produire "l'échec de la modification du propriétaire" et donne des informations d'erreur pertinentes.
Utilisez des composants com pour faire fonctionner les autorisations ACL
Dans Windows, les objets COM peuvent être utilisés pour modifier le fichier ACL via l'interface Win32Security , mais cela nécessite un code plus complexe et n'appartient pas à la catégorie des fonctions intégrées de PHP.
Appeler les commandes du système via des outils de ligne de commande <br> Utilisez EXEC pour appeler la commande ICACLS pour gérer les autorisations. Par exemple:
<?php
$file = 'testfile.txt';
$user = 'username';
exec("icacls {$file} /setowner {$user}", $output, $return_var);
if ($return_var === 0) {
echo "La modification du propriétaire a réussi";
} else {
echo "Le propriétaire n'a pas modifié";
print_r($output);
}
?>
Il convient de noter ici que les utilisateurs qui exécutent PHP doivent avoir des autorisations correspondantes pour réussir.
Envisagez d'utiliser WSL ou d'autres environnements compatibles POSIX <br> Sur Windows 10 et plus, après avoir activé le sous-système Windows pour Linux (WSL), vous pouvez utiliser Chown standard dans l'environnement Linux.
Dans l'environnement natif du système Windows, la fonction Chown de PHP est fondamentalement invalide et l'appel échoue généralement ou n'a aucun effet.
Le modèle d'autorisation de Windows est très différent d'UNIX et la gestion de la propriété des fichiers dépend davantage des outils ACL et système.
Si vous avez besoin de gérer les autorisations de fichiers Windows, vous devez envisager d'utiliser des commandes système telles que ICACLS ou interfaces COM.
Dans les projets multiplateformes, vous devez éviter de compter sur Chown pour modifier le propriétaire du fichier ou l'ajout de jugements environnementaux au code.
De cette façon, vous pouvez adopter des solutions correspondantes en fonction de l'environnement pour éviter les problèmes de gestion de l'autorisation causés par l'échec de Chown sous Windows.
Reportez-vous à l'exemple de code source et de description de la commande, voir:
https://gitbox.net/php/chown-windows-behavior