>  기사  >  백엔드 개발  >  모두가 PHP의 파일 시스템 기능을 배우도록 하세요 (1)

모두가 PHP의 파일 시스템 기능을 배우도록 하세요 (1)

藏色散人
藏色散人앞으로
2021-07-13 14:37:232904검색

이 글부터 시작하여 PHP 파일 시스템 관련 기능 시리즈를 배워보겠습니다. 실제로 이러한 기능 중 상당수는 우리가 의도적으로 기억할 필요는 없습니다. 그런 것이 있다는 것을 알고 있는 한, 사용할 때 문서를 확인하는 것을 잊지 마십시오.

파일 경로 관련 함수

파일 경로 관련 함수는 종종 일부 프레임워크에서 더 일반적이며 __FILE__ 및 __DIR__과 같은 매직 상수와 함께 사용되는 경우가 많습니다.

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() 함수는 경로에서 파일 이름을 가져오는 것입니다. 여기에는 두 개의 매개변수가 있습니다. 첫 번째는 파일의 경로이고 두 번째는 필터링된 내용입니다. 파일 이름의 접미사를 삭제합니다.

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

dirname()은 경로 중 경로 부분, 즉 파일 이름이 포함되지 않은 부분을 반환하는데, 이는 basename()과 정확히 반대되는 기능입니다.

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() 함수는 경로의 정보를 배열 형식으로 반환하는 데 사용됩니다. 결과에서 파일의 dirname 부분, basename 부분 및 파일 확장자를 볼 수 있습니다. 확장자를 포함하지 않는 파일 이름 내용입니다.

realpath()는 정규화된 절대 경로 이름을 반환합니다. 이는 모든 기호 연결을 확장하고 입력 경로에서 ./, ../ 및 중복 /를 처리합니다. 반환된 콘텐츠는 표준 절대 경로입니다.

파일 소유권 관련 정보 수정

다음으로 파일 관련 속성을 수정하는 몇 가지 기능, 주로 Linux 시스템 환경에서 파일 권한 정보의 동작을 알아보겠습니다.

물론 먼저 파일을 만들어야 합니다. 이는 Linux의 명령과 매우 유사합니다.

touch('test3.txt');

생성될 파일 이름을 제공하는 것 외에도 touch() 함수에는 파일 생성 시간과 액세스 시간을 지정할 수 있는 두 개의 선택적 매개 변수도 있습니다. 매개 변수가 제공되지 않으면 기본값은 현재입니다. 시간. 이 파일 이름은 권한이 있는 디렉터리에 대한 상대 또는 절대 경로일 수 있으며 해당 디렉터리에 빈 파일을 만듭니다.

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

fileowner() 함수를 통해 파일이 속한 사용자를 얻을 수 있습니다. 기본적으로 우리 사용자는 현재 시스템에 로그인된 사용자인 PHP 스크립트를 실행 중인 사용자입니다. 여기서는 chown() 함수를 사용하여 사용자를 www 사용자로 변경합니다. Clearstatcache()는 파일 시스템의 캐시 정보를 지우는 데 사용됩니다. 캐시가 정리되지 않은 경우에도 fileowner()는 이전 사용자 정보를 반환합니다.

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

마찬가지로 filegroup() 함수를 사용하여 파일 그룹 정보를 얻고, chgrp() 함수를 사용하여 파일 그룹을 수정합니다. fileperms()는 파일의 권한 정보를 반환하는 데 사용됩니다. 여기서는 sprintf()를 사용하여 결과 형식을 지정하고 일반적으로 사용되는 Linux 시스템 권한 형식을 얻습니다. chmod() 함수는 파일의 권한을 수정하는 데 사용됩니다. 권한 매개변수는 Linux 시스템에서 1, 2, 4와 그 조합을 나타내는 8진수 데이터로 구성된 세 개의 숫자이므로 추가해야 합니다. 이전 0이 사용됩니다. 작업이 올바르게 수행될 수 있는지 확인합니다. 시스템 파일 권한에 대한 지식과 관련하여 모든 사람은 Linux 시스템의 관련 내용을 주의 깊게 연구해야 합니다.

위 함수가 명령줄에서 실행되지 않는 경우 대부분의 이유는 권한 부족으로 인해 발생하므로 sudo를 사용하여 테스트할 수 있습니다. fastcgi에서 실행하는 경우 권한 문제에 더 주의를 기울여야 하며 서버가 작동할 수 있는 디렉터리에서만 안전한 파일 권한 수정을 수행해야 합니다.

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() 함수는 지정된 파일의 모든 속성 정보를 얻을 수 있습니다. 여기에서 파일의 uid, gid, ctime, mtime 및 기타 정보를 볼 수 있습니다.

소프트 및 하드 파일 연결과 관련된 작업

Linux 시스템에는 소프트 연결과 하드 연결에 대한 지식이 있습니다. 실제로 소프트 링크는 Windows의 바로 가기와 비슷하지만 하드 링크는 데이터 복사본 복사와 관련이 있습니다. PHP에서는 소프트 및 하드 연결 생성과 일부 관련 작업도 제공합니다.

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
// )

link() 함수를 사용하면 지정된 파일의 하드링크 파일이 생성되고, Symlink() 함수를 사용하면 소프트링크 파일이 생성됩니다. 상대적으로 우리는 더 많은 시나리오에서 소프트 연결을 사용합니다. lstat()는 stat() 함수와 동일한 기능을 가지고 있으며 파일의 다양한 속성 정보를 볼 수 있지만 lstat() 함수는 소프트 및 하드 링크 파일을 대상으로 합니다.

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

마찬가지로 소프트 연결과 하드 연결의 사용자 및 사용자 그룹 정보를 수정할 수도 있지만 해당 정보는 fileowner() 또는 filegroup()을 통해 볼 수 없습니다. 연결 파일이기 때문에 여전히 원본 파일에 바인딩되어 있습니다. fileowner()와 같은 함수를 사용하면 원본 파일의 정보를 계속 볼 수 있습니다. 시스템 환경에서 ls -l을 사용하여 연결 파일의 사용자 및 사용자 그룹 정보가 성공적으로 수정되었는지 확인할 수 있습니다.

요약

오늘의 콘텐츠는 비교적 간단하고, 권한 수정 작업은 일반적으로 사용되지 않습니다. 그러나 시스템 보안에는 여전히 매우 유용합니다. 예를 들어 업로드의 경우 실행 파일 업로드를 방지하려면 파일이 직접 실행되지 않도록 파일의 권한을 수정하여 역할을 수행할 수 있습니다. 보안 보호. 또한 디렉터리 경로와 관련된 작업은 일부 프레임워크의 기본이기도 합니다. dirname() 및 basename()과 같은 함수는 거의 모든 프레임워크 또는 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视频教程

위 내용은 모두가 PHP의 파일 시스템 기능을 배우도록 하세요 (1)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제