Maison >développement back-end >tutoriel php >Laissez tout le monde apprendre les fonctions du système de fichiers en PHP (1)

Laissez tout le monde apprendre les fonctions du système de fichiers en PHP (1)

藏色散人
藏色散人avant
2021-07-13 14:37:233015parcourir

À partir de cet article, nous apprendrons une série de fonctions liées au système de fichiers PHP. En fait, nous utilisons souvent beaucoup de ces fonctions. Vous n'avez pas besoin de vous en souvenir délibérément. Tant que vous savez qu'une telle chose existe, n'oubliez pas de consulter la documentation lorsque vous l'utilisez.

Fonctions liées au chemin de fichier

Les fonctions liées au chemin de fichier sont souvent plus courantes dans certains frameworks et sont souvent utilisées en conjonction avec __FILE__ et __DIR__ Des constantes magiques comme celle-ci sont utilisées. La fonction

echo "1) ".basename("/etc/sudoers.d", ".d"), PHP_EOL;
echo "2) ".basename("/etc/passwd"), PHP_EOL;
echo "3) ".basename("/etc/"), PHP_EOL;
echo "4) ".basename("."), PHP_EOL;
echo "5) ".basename("/"), PHP_EOL;
echo "6) ".basename("/usr/local/Cellar/php/7.3.9_1/README.md"), PHP_EOL;
// 1) sudoers
// 2) passwd
// 3) etc
// 4) .
// 5) 
// 6) README.md

basename() consiste à obtenir le nom du fichier dans le chemin. Elle a deux paramètres. Le premier est le chemin du fichier et le second est le contenu filtré. Par exemple, nous filtrons le premier. instruction de test L'extension du fichier.

echo "1) " . dirname("/etc/passwd") , PHP_EOL;
echo "2) " . dirname("/etc/") , PHP_EOL;
echo "3) " . dirname("."), PHP_EOL;
// 1) /etc
// 2) /
// 3) .

dirname() renvoie la partie chemin du chemin, c'est-à-dire la partie qui n'inclut pas le nom du fichier, ce qui est exactement la fonction opposée de basename().

La fonction
print_r(pathinfo('/usr/local/Cellar/php/7.3.9_1/README.md'));
// Array
// (
//     [dirname] => /usr/local/Cellar/php/7.3.9_1
//     [basename] => README.md
//     [extension] => md
//     [filename] => README
// )

echo realpath('./../../..//../etc/passwd'), PHP_EOL;
// /private/etc/passwd

pathinfo() est utilisée pour renvoyer les informations dans le chemin sous la forme d'un tableau. À partir du résultat, nous pouvons voir la partie dirname du fichier, la partie basename et l'extension de l'extension. fichier et ne contient pas l'extension. Le contenu du nom de fichier.

realpath() renvoie un nom de chemin absolu normalisé. Il développe toutes les connexions symboliques et gère ./, ../ et / redondants dans le chemin d'entrée. Le contenu renvoyé est un chemin absolu standard.

Modifier les informations relatives à la propriété des fichiers

Ensuite, nous apprendrons quelques fonctions pour modifier les attributs liés aux fichiers, principalement le fonctionnement des informations d'autorisation des fichiers dans l'environnement système Linux.

Bien sûr, nous devons d'abord créer un fichier. C'est très similaire à la commande sous Linux.

En plus de donner le nom du fichier à créer, la fonction
touch('test3.txt');

touch() possède également deux paramètres facultatifs qui peuvent spécifier l'heure de création et l'heure d'accès du fichier. Si aucun paramètre n'est donné, la valeur par défaut. est l'heure actuelle. Ce nom de fichier peut être un chemin relatif ou absolu vers un répertoire avec des autorisations et crée un fichier vide dans ce répertoire.

echo fileowner('test.txt'), PHP_EOL; // 501
chown('test.txt', 'www');
clearstatcache();
echo fileowner('test.txt'), PHP_EOL; // 70

Grâce à la fonction fileowner(), nous pouvons obtenir l'utilisateur auquel appartient un fichier. Par défaut, notre utilisateur est l'utilisateur qui exécute actuellement le script PHP, qui est l'utilisateur actuellement connecté au système. Ici, nous utilisons la fonction chown() pour changer l'utilisateur en utilisateur www. clearstatcache() est utilisé pour effacer les informations du cache du système de fichiers s'il n'est pas nettoyé, fileowner() renverra toujours les informations utilisateur précédentes.

echo filegroup('test.txt'), PHP_EOL; // 20
chgrp('test.txt', 'www');
clearstatcache();
echo filegroup('test.txt'), PHP_EOL; // 70

echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0766
chmod('test.txt', 0777);
clearstatcache();
echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0777

De même, utilisez la fonction filegroup() pour obtenir les informations de groupe du fichier, et chgrp() est utilisée pour modifier le groupe du fichier. fileperms() est utilisé pour renvoyer les informations d'autorisation du fichier. Il renvoie l'autorisation d'accès au fichier en mode numérique. Ici, nous utilisons sprintf() pour formater le résultat et obtenir notre format d'autorisation système Linux couramment utilisé. La fonction chmod() est utilisée pour modifier les autorisations des fichiers. Ses paramètres d'autorisation sont trois nombres composés de données octales, qui représentent 1, 2, 4 et leurs combinaisons dans le système Linux, nous devons donc ajouter le 0 précédent. pour s'assurer que l'opération peut être effectuée correctement. Concernant la connaissance des autorisations des fichiers système, chacun doit étudier attentivement le contenu pertinent du système Linux.

Notez que si la fonction ci-dessus ne s'exécute pas sur la ligne de commande, la plupart des raisons sont dues au manque d'autorisations. Vous pouvez utiliser sudo pour tester. Lorsque vous exécutez fastcgi, vous devez accorder plus d'attention aux problèmes d'autorisation et apporter des modifications sécurisées aux autorisations de fichiers uniquement dans les répertoires que notre serveur peut exploiter.

La fonction
print_r(stat('test.txt'));
// Array
// (
//     [0] => 16777220
//     [1] => 8707958352
//     [2] => 33279
//     [3] => 2
//     [4] => 70
//     [5] => 70
//     [6] => 0
//     [7] => 0
//     [8] => 1603070453
//     [9] => 1603070453
//     [10] => 1603072836
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707958352
//     [mode] => 33279
//     [nlink] => 2
//     [uid] => 70
//     [gid] => 70
//     [rdev] => 0
//     [size] => 0
//     [atime] => 1603070453
//     [mtime] => 1603070453
//     [ctime] => 1603072836
//     [blksize] => 4096
//     [blocks] => 0
// )

stat() peut obtenir toutes les informations d'attribut du fichier spécifié. Ici, nous pouvons voir l'uid, le gid, le ctime, le mtime et d'autres informations du fichier.

Opérations liées aux connexions de fichiers logicielles et matérielles

Dans les systèmes Linux, il existe des connaissances sur les connexions logicielles et les connexions matérielles. En fait, les liens symboliques sont comme des raccourcis dans Windows, tandis que les liens physiques sont liés à la copie d'une copie de données. En PHP, nous nous assurons également de la création de connexions soft et hard et de quelques opérations associées.

link('test.txt', 'ltest.txt');
echo linkinfo('ltest.txt'), PHP_EOL; // 16777220

symlink('test.txt', 'ltest2.txt');
echo linkinfo('ltest2.txt'), PHP_EOL; // 16777220

print_r(lstat('ltest2.txt'));
// Array
// (
//     [0] => 16777220
//     [1] => 8707962848
//     [2] => 41453
//     [3] => 1
//     [4] => 0
//     [5] => 20
//     [6] => 0
//     [7] => 8
//     [8] => 1603072717
//     [9] => 1603072717
//     [10] => 1603072717
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707962848
//     [mode] => 41453
//     [nlink] => 1
//     [uid] => 0
//     [gid] => 20
//     [rdev] => 0
//     [size] => 8
//     [atime] => 1603072717
//     [mtime] => 1603072717
//     [ctime] => 1603072717
//     [blksize] => 4096
//     [blocks] => 0
// )

L'utilisation de la fonction link() crée un fichier de lien physique du fichier spécifié, tandis que l'utilisation de symlink() crée un fichier de lien logiciel. Relativement parlant, nous utilisons des connexions souples dans davantage de scénarios. lstat() a la même fonction que la fonction stat(), affichant diverses informations d'attribut du fichier, mais la fonction lstat() est destinée aux fichiers de liens logiciels et physiques.

lchown('ltest2.txt', 'zhangyue');
lchgrp('ltest2.txt', 'staff');
// lrwxr-xr-x  1 zhangyue  staff      8 Oct 19 09:58 ltest2.txt -> test.txt

De même, nous pouvons également modifier les informations sur les utilisateurs et les groupes d'utilisateurs des connexions logicielles et matérielles, mais leurs informations ne peuvent pas être consultées via fileowner() ou filegroup(). Puisqu'il s'agit de fichiers de connexion, ils sont toujours liés au fichier d'origine. À l'aide de fonctions telles que fileowner(), vous pouvez toujours afficher les informations du fichier d'origine. Nous pouvons utiliser ls -l dans l'environnement système pour vérifier si les informations sur l'utilisateur et le groupe d'utilisateurs du fichier de connexion ont été modifiées avec succès.

Résumé

Le contenu d'aujourd'hui est relativement simple et l'opération de modification des autorisations n'est pas couramment utilisée. Cependant, ils restent très utiles pour la sécurité du système. Par exemple, pour le téléchargement, si nous voulons empêcher le téléchargement de fichiers exécutables, nous pouvons modifier les autorisations des fichiers pour empêcher que les fichiers soient exécutés directement, jouant ainsi un rôle dans protection de la sécurité. De plus, les opérations liées aux chemins de répertoires sont également à la base de certains frameworks. Des fonctions telles que dirname() et basename() seront vues à l'entrée de presque tous les frameworks ou de Composer.

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/6.PHP中的文件系统函数(一).php
参考文档:
https://www.php.net/manual/zh/ref.filesystem.php

推荐学习:《PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer