Hàm chmod() trong PHP
Trần Thị Vân
- 1222
- 08/08/2025
Chức năng của Hàm chmod() trong PHP
Hàm chmod() trong PHP dùng để phân quyền truy cập đọc, viết, thực thi cho file hoặc thư mục.
Cú pháp của Hàm chmod() trong PHP
$kết_quả = chmod("đường_dẫn_file_hoặc_thư_mục", phân_quyền);
đường_dẫn_file_hoặc_thư_mục: Đường dẫn file hoặc thư mục (Ví dụ: thumuctest/test.txt, thumuctest)
phân_quyền: Phần quyền (Ví dụ: 777, 0644,....)
$kết_quả: Kết quả trả về true nếu phân quyền cho file hoặc thư mục thành công, trả về false nếu phân quyền cho file hoặc thư mục thất bại.
Code Hàm chmod() trong PHP
<?php
// Phân quyền cho file
$filename = "thumuctest/test.txt";
if (chmod($filename, 0644)) {
echo "Đã thay đổi quyền 0644 cho file '$filename' thành công.";
} else {
echo "Không thể thay đổi quyền của '$filename'.";
}
// Kết quả: Đã thay đổi quyền 0644 cho file 'thumuctest/test.txt' thành công.
// Phân quyền cho thư mục
$duongdanthumuc = "thumuctest";
if (chmod($duongdanthumuc , 0644)) {
echo "Đã thay đổi quyền 0644 cho thư mục '$duongdanthumuc ' thành công.";
} else {
echo "Không thể thay đổi quyền của '$duongdanthumuc '.";
}
// Kết quả: Đã thay đổi quyền 0644 cho thư mục 'thumuctest' thành công.
?>
Kết quả:
Đã thay đổi quyền 0644 cho file 'thumuctest/test.txt' thành công.
Đã thay đổi quyền 0644 cho thư mục 'thumuctest' thành công.
Các loại phân quyền của Hàm chmod() trong PHP
Quyền chmod 0755
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Thực thi.
Quyền công khai: Đọc, Thực thi.
Quyền chmod 0777
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0644
Quyền của chủ sở hữu: Đọc, Ghi
Quyền của nhóm: Đọc
Quyền công khai: Đọc
Quyền chmod 0557
Quyền của chủ sở hữu: Đọc, Thực thi.
Quyền của nhóm: Đọc, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0667
Quyền của chủ sở hữu: Đọc, Ghi.
Quyền của nhóm: Đọc, Ghi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0767
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0677
Quyền của chủ sở hữu: Đọc, Ghi
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0577
Quyền của chủ sở hữu: Đọc, Thực thi.
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0757
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Quyền chmod 0775
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Thực thi.
Quyền chmod 0444
Quyền của chủ sở hữu: Đọc
Quyền của nhóm: Đọc
Quyền công khai: Đọc
Quyền chmod 0664
Quyền của chủ sở hữu: Đọc, Ghi
Quyền của nhóm: Đọc, Ghi
Quyền công khai: Đọc
Quyền chmod 0666
Quyền của chủ sở hữu: Đọc, Ghi
Quyền của nhóm: Đọc, Ghi
Quyền công khai: Đọc, Ghi
Quyền chmod 0766
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi.
Quyền công khai: Đọc, Ghi.
Quyền chmod 0776
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Ghi
Quyền chmod 0777
Quyền của chủ sở hữu: Đọc, Ghi, Thực thi.
Quyền của nhóm: Đọc, Ghi, Thực thi.
Quyền công khai: Đọc, Ghi, Thực thi.
Những lỗi thường gặp khi sử dụng chmod() trong PHP
Trong thực tế, chmod() không phải lúc nào cũng thay đổi quyền file thành công dù cú pháp PHP không có lỗi. Nguyên nhân thường nằm ở giá trị permission, quyền của tài khoản đang chạy PHP hoặc cách xác định file và thư mục cần xử lý.
Kiểm tra đúng nguyên nhân sẽ giúp tránh tình trạng ứng dụng không thể ghi file, tạo thư mục, tải tệp lên hoặc vô tình cấp quyền rộng hơn mức cần thiết.
chmod() không thay đổi được quyền file hoặc thư mục
Một trong những nguyên nhân phổ biến là tài khoản thực thi PHP không có đủ quyền để thay đổi permission của đối tượng được chỉ định. Đây là vấn đề thuộc về hệ điều hành và máy chủ, không đơn thuần là lỗi của hàm PHP.
Trước khi gọi chmod(), nên kiểm tra đường dẫn có trỏ đúng đến file hoặc thư mục hay không. Có thể kết hợp is_file(), is_dir() hoặc file_exists() để xác nhận đối tượng tồn tại.
Ví dụ:
<?php
$path = 'uploads/data.txt';
if (is_file($path)) {
if (chmod($path, 0644)) {
echo 'Đã thay đổi quyền.';
} else {
echo 'Không thể thay đổi quyền.';
}
}
?>
Nếu hàm trả về false, không nên chỉ thử một permission khác. Hãy kiểm tra quyền sở hữu file, user chạy PHP và các giới hạn bảo mật trên máy chủ để tìm đúng nguyên nhân.
Truyền sai giá trị quyền khi sử dụng chmod()
Giá trị permission là phần dễ gây nhầm lẫn nhất khi sử dụng chmod(). Các quyền thường được biểu diễn bằng số bát phân như 0644, 0600 hoặc 0755. Việc bỏ số 0 ở đầu có thể khiến giá trị được hiểu theo cách khác với mong muốn.
Chẳng hạn, khi muốn thiết lập quyền đọc và ghi cho chủ sở hữu, đồng thời chỉ cho nhóm và người khác quyền đọc, có thể sử dụng:
<?php
chmod('uploads/data.txt', 0644);
?>
Không nên chọn quyền chỉ vì một cấu hình nào đó “có vẻ chạy được”. Quyền càng rộng thì phạm vi truy cập vào file càng lớn. Đặc biệt với các file chứa dữ liệu cấu hình, thông tin kết nối hoặc dữ liệu riêng tư, cần sử dụng permission phù hợp với nhu cầu thực tế.
Phân biệt quyền của file và thư mục khi chmod()
Permission có ý nghĩa khác nhau khi áp dụng cho file và thư mục. Với file, quyền đọc thường liên quan đến khả năng xem nội dung, còn quyền ghi cho phép thay đổi nội dung. Với thư mục, quyền đọc liên quan đến việc xem danh sách mục bên trong, trong khi quyền thực thi cho phép truy cập vào các mục trong thư mục.
Vì vậy, không nên áp dụng cùng một giá trị permission cho mọi đối tượng chỉ để đơn giản hóa cấu hình.
Ví dụ, file dữ liệu thông thường có thể cần quyền 0644, trong khi một thư mục cần cho phép ứng dụng truy cập và tạo file bên trong có thể sử dụng quyền 0755, tùy cấu hình máy chủ.
<?php
$file = 'uploads/data.txt';
$directory = 'uploads';
chmod($file, 0644);
chmod($directory, 0755);
?>
Giá trị phù hợp còn phụ thuộc vào user, group và cách máy chủ web vận hành. Do đó, nên cấp đúng mức quyền mà ứng dụng thực sự cần thay vì mặc định mở rộng quyền cho tất cả người dùng.
Thay đổi quyền cho nhiều file và thư mục bằng PHP
Khi xử lý một thư mục chứa nhiều file, có thể duyệt từng đối tượng rồi áp dụng chmod() theo loại. Cách này giúp kiểm soát permission rõ ràng hơn thay vì thay đổi hàng loạt một cách thiếu kiểm soát.
<?php
$directory = 'uploads';
$items = scandir($directory);
foreach ($items as $item) {
if ($item === '.' || $item === '..') {
continue;
}
$path = $directory . '/' . $item;
if (is_file($path)) {
chmod($path, 0644);
}
}
?>
Trong ví dụ trên, chỉ các file trực tiếp bên trong thư mục uploads được xử lý. Các thư mục con không bị thay đổi quyền. Đây là điểm cần lưu ý nếu hệ thống có cấu trúc thư mục phức tạp.
Nếu cần xử lý cả thư mục con, nên xây dựng logic duyệt đệ quy và xác định permission riêng cho file, thư mục. Đồng thời, tránh cấp quyền quá rộng cho toàn bộ cây thư mục vì một thiết lập sai có thể ảnh hưởng đến nhiều dữ liệu trên máy chủ.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Hàm chmod() trong PHP.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *