PHP – File Permissions

Khái niệm quyền truy cập là cốt lõi của hệ thống tệp Unix/Linux. Quyền truy cập xác định ai có thể truy cập một tệp và cách mà người đó có thể truy cập tệp. Quyền tệp trong Linux được điều chỉnh bởi chmod command , có thể được chạy trong terminal Linux. PHP cung cấp chmod() function mà bạn có thể sử dụng để xử lý quyền tệp một cách lập trình.

Hàm chmod() của PHP chỉ có hiệu quả khi bạn làm việc trên hệ điều hành Linux. Nó không hoạt động trên Windows, vì hệ điều hành Windows có cơ chế khác để kiểm soát quyền truy cập tệp.

Để xem các quyền được bật trên một tệp, hãy lấy danh sách các tệp bằng cách sử dụng lệnh " ls -l " (danh sách dài).

mvl@GNVBGL3:~$ ls -l

-rwxr-xr-x 1 mvl mvl 16376 May  5 21:52 a.out
-rw-r--r-- 1 mvl mvl    83 May  5 21:52 hello.cpp
-rwxr-xr-x 1 mvl mvl    43 Oct 11 14:50 hello.php
-rwxr-xr-x 1 mvl mvl    43 May  8 10:01 hello.py
drwxr-xr-x 5 mvl mvl  4096 Apr 20 21:52 myenv

Cột đầu tiên chứa các cờ quyền của từng tệp. Cột thứ ba và thứ tư chỉ ra chủ sở hữu và nhóm của từng tệp, tiếp theo là kích thước, ngày và giờ, và tên tệp.

Chuỗi quyền có mười ký tự, ý nghĩa của chúng được mô tả như sau −

Position Meaning
1 "d" if a directory, "-" if a normal file
2, 3, 4 read, write, execute permission for user (owner) of file
5, 6, 7 read, write, execute permission for group
8, 9, 10 read, write, execute permission for other (world)

Các ký tự trong chuỗi quyền có ý nghĩa như sau −

Value Meaning
- Flag is not set.
r File is readable.
w File is writable. For directories, files may be created or removed.
x File is executable. For directories, files may be listed.

Nếu bạn xem xét mục đầu tiên trong danh sách trên −

-rwxr-xr-x 1 mvl mvl 16376 May  5 21:52 a.out

Tập tin "a.out" thuộc sở hữu của người dùng "mvl" và nhóm "mvl". Đây là một tập tin bình thường với quyền "đọc/ghi/thực thi" cho chủ sở hữu, và quyền "đọc/thực thi" cho nhóm cũng như cho những người khác.

Biểu diễn nhị phân và bát phân của các cờ quyền có thể được hiểu qua bảng sau −

Octal Digit Binary Representation (rwx) Permission
0 000 none
1 001 execute only
2 010 write only
3 011 write and execute
4 100 read only
5 101 read and execute
6 110 read and write
7 111 read, write, and execute (full permissions)

The chmod() Function

Hàm chmod() có thể thay đổi quyền của một tệp được chỉ định. Nó trả về true khi thành công, nếu không sẽ trả về false khi thất bại.

chmod(string $filename, int $permissions): bool

Hàm chmod() cố gắng thay đổi chế độ của tệp được chỉ định ( $filename ) thành chế độ được chỉ định trong permissions.

Tham số thứ hai $permissions là một số bát phân với bốn chữ số bát phân. Chữ số đầu tiên luôn là số không, chữ số thứ hai chỉ định quyền cho chủ sở hữu, chữ số thứ ba cho nhóm người dùng của chủ sở hữu và chữ số thứ tư cho mọi người khác. Mỗi chữ số là tổng của các giá trị cho mỗi loại quyền.

1 Execute Permission
2 Write Permission
4 Read Permission

Giá trị mặc định của $permissions 0777 , có nghĩa là thư mục được tạo ra với quyền thực thi, ghi và đọc được bật.

Example

Hãy xem ví dụ sau −

<?php

   // Read and write for owner, nothing for everybody else
   chmod("/PhpProject/sample.txt", 0600);

   // Read and write for owner, read for everybody else
   chmod("/PhpProject/sample.txt", 0644);

   // Everything for owner, read and execute for everybody else
   chmod("/PhpProject/sample.txt", 0755);

   // Everything for owner, read for owner's group
   chmod("/PhpProject/sample.txt", 0740);
?>

The chown() Function

Hàm chown() cố gắng thay đổi chủ sở hữu của tệp filename thành một người dùng mới. Lưu ý rằng chỉ có người dùng siêu cấp (superuser) mới có thể thay đổi chủ sở hữu của một tệp.

chown(string $filename, string|int $user): bool

Example

Hãy xem ví dụ sau −

<?php

   // File name and username to use
   $file_name= "index.php";
   $path = "/PhpProject/backup: " . $file_name ;
   $user_name = "root";

   // Set the user
   chown($path, $user_name);

   // Check the result
   $stat = stat($path);
   print_r(posix_getpwuid(fileowner($path)));
?>

The chgrp() Function

Hàm chgrp() cố gắng thay đổi nhóm của tệp filename thành group.

chgrp(string $filename, string|int $group): bool

Chỉ có một superuser có thể thay đổi nhóm của một tệp một cách tùy ý; người dùng khác có thể thay đổi nhóm của một tệp thành bất kỳ nhóm nào mà người dùng đó là thành viên.

Example

Hãy xem ví dụ sau −

<?php
   $filename = "/PhpProject/sample.txt";
   $format = "%s's Group ID @ %s: %d\n";
   printf($format, $filename, date('r'), filegroup($filename));
   chgrp($filename, "admin");
   clearstatcache();  	// do not cache filegroup() results
   printf($format, $filename, date('r'), filegroup($filename));
?>

Nó sẽ tạo ra output

/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0
/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0