Funktionen für den Dateipfad
Funktionen für den Dateipfad kommen in manchen Frameworks häufiger vor und werden häufig in Verbindung mit magischen Konstanten wie __FILE__ und __DIR__ verwendet. Die Funktion
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() dient zum Abrufen des Dateinamens im Pfad. Der erste ist der Pfad der Datei und der zweite ist der gefilterte Inhalt. In der ersten Testanweisung filtern wir das Suffix des Dateinamens aus.
echo "1) " . dirname("/etc/passwd") , PHP_EOL; echo "2) " . dirname("/etc/") , PHP_EOL; echo "3) " . dirname("."), PHP_EOL; // 1) /etc // 2) / // 3) .
dirname() gibt den Pfadteil des Pfades zurück, also den Teil, der den Dateinamen nicht enthält, was genau die entgegengesetzte Funktion von basename() ist. Die Funktion
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() wird verwendet, um die Informationen im Pfad in Form eines Arrays zurückzugeben. Aus dem Ergebnis können wir den Dirname-Teil der Datei, den Basisnamen-Teil sowie die Erweiterung der Datei sehen und der Dateinameninhalt, der die Erweiterung nicht enthält.
realpath() gibt einen normalisierten absoluten Pfadnamen zurück. Es erweitert alle symbolischen Verbindungen und verarbeitet ./, ../ und redundante / im Eingabepfad.
Ändern Sie Informationen zum Dateibesitz.
Als nächstes lernen wir einige Funktionen kennen, die dateibezogene Attribute ändern, hauptsächlich den Betrieb von Dateiberechtigungsinformationen in der Linux-Systemumgebung.
Natürlich müssen wir zuerst eine Datei erstellen. Es ist dem Befehl unter Linux sehr ähnlich. Die Funktion
touch('test3.txt');
touch() gibt nicht nur den Namen der zu erstellenden Datei an, sondern verfügt auch über zwei optionale Parameter zur Angabe der Erstellungszeit und der Zugriffszeit der Datei. Wenn keine Parameter angegeben werden, ist der Standardwert die aktuelle Zeit. Dieser Dateiname kann ein relativer oder absoluter Pfad zu einem Verzeichnis mit Berechtigungen sein und erstellt eine leere Datei in diesem Verzeichnis.
echo fileowner('test.txt'), PHP_EOL; // 501 chown('test.txt', 'www'); clearstatcache(); echo fileowner('test.txt'), PHP_EOL; // 70
Über die Funktion fileowner() können wir den Benutzer ermitteln, zu dem eine Datei gehört. Standardmäßig ist unser Benutzer der Benutzer, der gerade das PHP-Skript ausführt, also der aktuell angemeldete Benutzer des Systems. Hier verwenden wir die Funktion chown(), um den Benutzer in einen www-Benutzer zu ändern. clearstatcache() wird verwendet, um die Cache-Informationen des Dateisystems zu löschen. Wenn es nicht bereinigt wird, gibt fileowner() weiterhin die vorherigen Benutzerinformationen zurück.
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
Verwenden Sie in ähnlicher Weise die Funktion filegroup(), um die Gruppeninformationen der Datei abzurufen, und chgrp() wird verwendet, um die Gruppe der Datei zu ändern. fileperms() wird verwendet, um die Berechtigungsinformationen der Datei zurückzugeben. Es gibt die Dateizugriffsberechtigung im numerischen Modus zurück. Hier verwenden wir sprintf(), um das Ergebnis zu formatieren und unser häufig verwendetes Linux-Systemberechtigungsformat zu erhalten. Die Funktion chmod() wird zum Ändern der Berechtigungen von Dateien verwendet. Ihre Berechtigungsparameter bestehen aus drei Zahlen, die aus Oktaldaten bestehen und 1, 2, 4 und deren Kombinationen im Linux-System darstellen. Daher müssen wir hinzufügen. Die vorherige 0 wird verwendet um sicherzustellen, dass der Vorgang korrekt durchgeführt werden kann. In Bezug auf die Kenntnis der Systemdateiberechtigungen muss jeder den relevanten Inhalt im Linux-System sorgfältig studieren.
Beachten Sie, dass, wenn die obige Funktion nicht in der Befehlszeile ausgeführt werden kann, die meisten Gründe auf fehlende Berechtigungen zurückzuführen sind. Sie können sudo zum Testen verwenden. Bei der Ausführung in fastcgi müssen Sie den Berechtigungsproblemen mehr Aufmerksamkeit schenken und sichere Dateiberechtigungsänderungen nur in Verzeichnissen vornehmen, die unser Server bedienen kann. Die Funktion
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() kann alle Attributinformationen der angegebenen Datei abrufen. Hier können wir die UID, GID, Ctime, Mtime und andere Informationen der Datei sehen.
Vorgänge im Zusammenhang mit weichen und harten Dateiverbindungen
In Linux-Systemen gibt es Kenntnisse über weiche und harte Verbindungen. Tatsächlich ähneln Softlinks Verknüpfungen in Windows, während Hardlinks mit dem Kopieren einer Datenkopie zusammenhängen. In PHP bieten wir uns auch die Möglichkeit, weiche und harte Verbindungen sowie einige damit verbundene Vorgänge zu erstellen.
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 // )
Mit der Funktion link() wird eine Hardlink-Datei der angegebenen Datei erstellt, während mit symlink() eine Softlink-Datei erstellt wird. Relativ gesehen verwenden wir weiche Verbindungen in mehr Szenarien. lstat() hat die gleiche Funktion wie die Funktion stat() und zeigt verschiedene Attributinformationen der Datei an, die Funktion lstat() ist jedoch auf Soft- und Hardlink-Dateien ausgerichtet.
lchown('ltest2.txt', 'zhangyue'); lchgrp('ltest2.txt', 'staff'); // lrwxr-xr-x 1 zhangyue staff 8 Oct 19 09:58 ltest2.txt -> test.txt
Ähnlich können wir auch die Benutzer- und Benutzergruppeninformationen von Soft- und Hard-Verbindungen ändern, ihre Informationen können jedoch nicht über fileowner() oder filegroup() angezeigt werden. Da es sich um Verbindungsdateien handelt, sind sie weiterhin an die Originaldatei gebunden. Mit Funktionen wie fileowner() können Sie weiterhin die Informationen der Originaldatei anzeigen. Wir können ls -l in der Systemumgebung verwenden, um zu überprüfen, ob die Benutzer- und Benutzergruppeninformationen der Verbindungsdatei erfolgreich geändert wurden.
Zusammenfassung
Der heutige Inhalt ist relativ einfach und das Ändern von Berechtigungen wird nicht häufig verwendet. Sie sind jedoch immer noch sehr nützlich für die Systemsicherheit. Wenn wir beispielsweise das Hochladen ausführbarer Dateien verhindern möchten, können wir die Berechtigungen der Dateien ändern, um zu verhindern, dass die Dateien direkt ausgeführt werden, und spielen somit eine Rolle Sicherheitsschutz. Darüber hinaus sind Operationen im Zusammenhang mit Verzeichnispfaden auch die Grundlage einiger Frameworks. Funktionen wie dirname() und basename() sind am Eingang fast aller Frameworks oder Composer zu sehen.
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/6.PHP中的文件系统函数(一).php 参考文档: https://www.php.net/manual/zh/ref.filesystem.php
推荐学习:《PHP视频教程》