Đang kiểm tra tệp php. Tạo, gán quyền truy cập, xóa và kiểm tra sự tồn tại của thư mục trong PHP

Việc sử dụng rộng rãi cơ sở dữ liệu không làm cho hệ thống tập tin thông thường trở nên không phù hợp. Việc ghi và đọc tập tin vẫn mất nơi quan trọng trong lập trình.

Các thuật toán kiểm tra sự hiện diện của tệp cho phép bạn tránh lỗi khi thực thi mã. Hàm file_exists của PHP cung cấp một giải pháp đơn giản để kiểm tra sự tồn tại của tệp hoặc thư mục.

Cú pháp và cách sử dụng hàm file_exists

Kết quả của hàm là đúng hoặc sai. Tham số duy nhất là tên tệp và đường dẫn đến nó. Kết quả của hàm được lưu vào bộ đệm vì nếu PHP file_exists không hoạt động nhưng tệp thực sự tồn tại thì đây là lỗi thuật toán.

Bằng cách sử dụng hàm clearstatcache(), bạn có thể tránh được nhiều lỗi khi kiểm tra trạng thái của hệ thống tập tin. Nhưng hãy lưu ý rằng trên một tệp không tồn tại, PHP file_exists sẽ trả về false cho đến khi tệp bạn đang tìm kiếm được tạo và sau đó sẽ trả về true ngay cả khi nó đã bị xóa.

Sự kết hợp chính xác giữa hàm clearstatcache() và các hàm liên quan đến hệ thống tệp (ví dụ: is_writable(), is_readable(), is_executable(), is_file(), is_dir() và các hàm khác) cho phép bạn tránh thực thi tập lệnh “ẩn” lỗi.

Bộ nhớ đệm cải thiện đáng kể hiệu năng hệ thống, nhưng trong một số trường hợp tập tin quan trọng có thể tạo ra kết quả thực sự không đáng tin cậy và gây ra lỗi thời gian chạy nghiêm trọng, khó phát hiện.

Tham số hàm PHP file_exists

PHP có thể được cài đặt trên các nền tảng điện toán khác nhau và do đó đường dẫn và cách đặt tên tệp có thể khác nhau.

Tài liệu tuyên bố rằng khi Kiểm tra PHP tập trung vào UID/GID hơn là các mã định danh hiệu quả. Phát triển một thuật toán sử dụng PHP file_exists, bạn không chỉ nên chú ý đến dấu gạch chéo chính xác (tiến hoặc lùi), mã hóa đường dẫn đến tệp và tên của chính tệp mà còn kiểm tra sự hiện diện của trường hợp bắt buộc, ký tự chính xác, quyền truy cập và các hoàn cảnh khác.

Kết quả âm tính có thể bị ảnh hưởng bởi việc mã hóa tệp tập lệnh và có thể yêu cầu chuyển đổi chuỗi ký tự được lấy từ cơ sở dữ liệu.

Sử dụng hàm trong thực tế

Lĩnh vực sử dụng Tập lệnh PHP Khác biệt đáng kể. Điều này không có nghĩa là file_exists PHP chỉ được sử dụng để lưu trữ thông tin hệ thống, tệp dữ liệu, đối tượng hoặc hình ảnh được tạo động.

Thường xuyên có trường hợp sử dụng hình thành luồng khối lượng lớn thông tin tạm thời không hiệu quả để đưa ngay vào cơ sở dữ liệu. Thông tin từ những khách truy cập khác nhau có thể đến trang web và chỉ sau khi xử lý sơ bộ trong một khoảng thời gian nhất định thông tin cần thiết phải được đặt trong các bảng cơ sở dữ liệu.

Đọc tập tin hệ thống có thể tạo ra bộ nhớ đệm khi trang được làm mới nhiều lần hoặc hành động sai trái khách thăm quan. Thực tế có rất nhiều trường hợp nhưng sử dụng đúng chức năng nó cho phép bạn viết mã an toàn và đáng tin cậy.

Có những lúc bạn cần kiểm tra xem tập tin được chỉ định hoặc không, chẳng hạn như để thực hiện một số hành động với tệp sau đó.

Tôi cũng gặp phải vấn đề này khi phát triển mô-đun. Và tôi tìm thấy hai lựa chọn để giải quyết vấn đề.

Kiểm tra sự tồn tại của tệp bằng liên kết URL

Trong PHP có một hàm " fopen", có thể được sử dụng để mở URL được chỉ định.

Chúng ta đang làm gì vậy? Chúng tôi cố gắng mở tệp và nếu thành công thì tệp đó tồn tại, nếu không thì tệp không tồn tại.

Thực hiện:

Nhưng điều gì sẽ xảy ra nếu chúng ta không có một tệp mà có nhiều tệp, có thể nói là một mảng liên kết? Đây chính xác là nhiệm vụ đã đặt ra trước mắt tôi ngay từ đầu. Và giải pháp cho vấn đề này như sau:

Trong trường hợp này, chúng tôi nhận được danh sách chỉ những tệp tồn tại.

Kiểm tra sự tồn tại của một tập tin cục bộ

Từ “cục bộ” có nghĩa là tập lệnh và tệp để xác minh được đặt trên cùng một máy chủ. Nếu bạn có đủ mảng lớn liên kết - tùy chọn này là tùy chọn tốt nhất để giải quyết vấn đề vì chúng tôi không đưa ra yêu cầu máy chủ của bên thứ ba, nhưng quét các thư mục được chỉ định.

Phương thức này sử dụng hàm “file_exists” và tương tự với tùy chọn trước đó, chỉ cần thay thế một phần của tập lệnh:

Và tương tự cho mảng liên kết:

Điều này có đáng không ghi chú? Thực tế là phương pháp này thuận tiện cho việc chạy các tệp nằm trong hệ thống tệp của chúng tôi. Vì vậy, nên chỉ ra tất cả các liên kết là liên kết tương đối.

Nhân tiện, khi thực hiện một trong các đơn đặt hàng, bằng phương pháp này, tôi có thể quét khoảng 135.000 tệp chỉ trong vài giây.

Tham số bắt buộc cho hàm này là tên đường dẫn, chỉ định đường dẫn đến thư mục cần tạo.

mkdir( "thư mục mới" );

Nếu bạn chỉ định thư mục theo cách này, nó sẽ được tạo trong cùng thư mục mà tập lệnh PHP được khởi chạy. Nếu bạn cần tạo thư mục ở một vị trí khác, bạn có thể chỉ định đường dẫn tương đối vào thư mục sẽ được tạo hoặc chỉ định đường dẫn đầy đủ từ thư mục gốc của trang.

mkdir( "../thư mục mới" ); // xuống một cấp

mkdir("/folder1/folder2/newfolder" ); // đường dẫn đầy đủ

Trong ví dụ cuối cùng điều kiện tiên quyết sẽ có sự tồn tại của thư mục con "folder1" và "folder2". Nếu chúng không có ở đó, hàm trong biểu mẫu này sẽ không thể tạo thư mục và sẽ trả về lỗi:

Cảnh báo: mkdir() : Không có tập tin hoặc thư mục như vậy trong …

Nếu thành công, hàm sẽ trả về Giá trị thực. Nếu gói không được tạo, giá trị Sai sẽ được trả về.

if (mkdir("thư mục mới"))
tiếng vọng "Thư mục được tạo thành công";
khác
tiếng vọng "Thư mục chưa được tạo";

Nhưng bạn không nên sử dụng chức năng này mà không kiểm tra sự hiện diện của thư mục, vì máy chủ vẫn sẽ hiển thị lỗi không thể tạo được thư mục.

Gán quyền khi tạo thư mục

Để chuyển nhượng quyền cho thư mục đang được tạo tương ứng với tham số tùy chọn thứ hai của hàm mkdir. Theo mặc định, các đặc quyền tối đa được chỉ định – 0777.

Quyền được chỉ định bằng cách sử dụng giá trị bát phân với số 0 bắt buộc ở đầu. Ngoài số 0 đầu tiên, các con số thể hiện cấp độ truy cập của chủ sở hữu, nhóm của chủ sở hữu và mọi người khác.

0 – quyền truy cập bị từ chối;

1 – quyền truy cập đọc;

2 – quyền truy cập ghi;

4 – truy cập thực thi.

Thông thường, các quyền được chỉ định dưới dạng số tiền tổng hợp, ví dụ:

7 – toàn quyền truy cập (1+2+4);

5 – đọc và thực thi (1+4).

mkdir( "thư mục mới", 0777); // toàn quyền truy cập cho mọi người

Tạo nhiều thư mục con lồng nhau

Bạn có thể tạo nhiều thư mục con cùng một lúc bằng cách chỉ định một tham số Boolean tùy chọn khác – đệ quy.

mkdir("folder1/folder2/newfolder", 0777, True); // toàn quyền truy cập cho mọi người

Trong trường hợp này, nếu không có thư mục "folder1" và "folder2", hàm sẽ tạo cả hai thư mục đó và thư mục "newfolder". Nếu không có vấn đề nào khác phát sinh thì sẽ không có thông báo lỗi nào được hiển thị và hàm sẽ trả về True.

Xóa một thư mục

Một thư mục trống trong PHP có thể được xóa bằng hàm rmdir. Tham số dirname cũng chỉ định đường dẫn đầy đủ hoặc tương đối đến thư mục cần xóa:

rmdir( "thư mục của tôi" );

rmdir("folder1/folder2/myfolder" );

Trong mỗi trường hợp này, chỉ có thư mục "myfolder" bị xóa. Nếu không có thư mục hoặc đường dẫn được chỉ định không chính xác, sẽ hiển thị lỗi:

Cảnh báo: rmdir(myfolder): Không có tập tin hoặc thư mục như vậy trong ...

Xóa thư mục không trống

Việc xóa một thư mục không trống được thực hiện bằng cách xóa tuần tự các file con trong thư mục có chức năng hủy liên kết, sau đó xóa thư mục trống hàm rmdir. Bạn có thể sử dụng một chức năng như thế này để làm điều này:

hàm my_delete_dir($mypath)(
$dir = opendir($mypath);
trong khi (($file = readdir($dir)))(
if (is_file($mypath."/" .$file))
hủy liên kết($mypath. "/" .$file);
elseif (is_dir($mypath."/" .$file) && ($file != "." ) && ($file != ".." ))
my_delete_dir($mypath."/" .$file);
}
closeir($dir);
rmdir($mypath);
}

my_delete_dir("myfolder" ); // gọi hàm

Kiểm tra sự tồn tại của một thư mục

Trước hầu hết các thao tác với thư mục, cần kiểm tra xem chúng có tồn tại hay không. Hàm file_exists được sử dụng cho việc này.

Ngoài ra, bạn cần đảm bảo rằng đối tượng được chỉ định là một thư mục chứ không phải tệp - hàm is_dir. Thư mục cần quét được chỉ định bằng đường dẫn tương đối hoặc đầy đủ.

if (file_exists("myfolder"))
tiếng vọng "Thư mục được chỉ định tồn tại";
khác
tiếng vọng "Thư mục được chỉ định không tồn tại";

if (is_dir("myfolder"))
tiếng vọng "Đối tượng thư mục được chỉ định";
khác
tiếng vọng "Đối tượng được chỉ định không phải là một thư mục";

Đôi khi, bạn cần kiểm tra xem một tệp được chỉ định có tồn tại hay không, chẳng hạn như để thực hiện một số hành động trên tệp sau đó.

Tôi cũng gặp phải vấn đề này khi phát triển mô-đun. Và tôi tìm thấy hai lựa chọn để giải quyết vấn đề.

Kiểm tra sự tồn tại của tệp bằng liên kết URL

Trong PHP có một hàm " fopen", có thể được sử dụng để mở URL được chỉ định.

Chúng ta đang làm gì vậy? Chúng tôi cố gắng mở tệp và nếu thành công thì tệp đó tồn tại, nếu không thì tệp không tồn tại.

Thực hiện:

Nhưng điều gì sẽ xảy ra nếu chúng ta không có một tệp mà có nhiều tệp, có thể nói là một mảng liên kết? Đây chính xác là nhiệm vụ đã đặt ra trước mắt tôi ngay từ đầu. Và giải pháp cho vấn đề này như sau:

Trong trường hợp này, chúng tôi nhận được danh sách chỉ những tệp tồn tại.

Kiểm tra sự tồn tại của một tập tin cục bộ

Từ “cục bộ” có nghĩa là tập lệnh và tệp để xác minh được đặt trên cùng một máy chủ. Nếu bạn có một loạt liên kết khá lớn, tùy chọn này là tùy chọn tốt nhất để giải quyết vấn đề, vì chúng tôi không đưa ra yêu cầu tới máy chủ của bên thứ ba mà quét các thư mục được chỉ định.

Phương thức này sử dụng hàm “file_exists” và tương tự với tùy chọn trước đó, chỉ cần thay thế một phần của tập lệnh:

Và tương tự cho mảng liên kết:

Điều này có đáng không ghi chú? Thực tế là phương pháp này thuận tiện cho việc chạy các tệp nằm trong hệ thống tệp của chúng tôi. Vì vậy, nên chỉ ra tất cả các liên kết là liên kết tương đối.

Nhân tiện, khi thực hiện một trong các đơn đặt hàng, bằng phương pháp này, tôi có thể quét khoảng 135.000 tệp chỉ trong vài giây.