is_file hoặc file_exists trong PHP


116

Tôi cần kiểm tra xem một tệp có trên ổ cứng tại một vị trí được chỉ định không ($ path. $ File_name).

Đó là sự khác biệt giữa is_file() và các file_exists()chức năng và cái nào tốt hơn / nhanh hơn để sử dụng trong PHP?

Câu trả lời:


166

is_file()sẽ trở lại falsenếu đường dẫn đã cho vào một thư mục. file_exists()sẽ trả về truenếu đường dẫn đã cho trỏ đến một tệp hoặc thư mục hợp lệ . Vì vậy, nó sẽ phụ thuộc hoàn toàn vào nhu cầu của bạn. Nếu bạn muốn biết cụ thể đó có phải là một tập tin hay không, hãy sử dụng is_file(). Nếu không, sử dụng file_exists().


1
theo như tôi biết, if_file cũng thất bại đối với các liên kết tượng trưng, ​​không chỉ các thư mục.
stefs

is_file () return true nếu tệp tồn tại trong thư mục hoặc false nếu tệp không tồn tại khi tôi kiểm tra vào năm 2020 có thể là phiên bản php cập nhật nó
heySushil

35

is_file()là nhanh nhất, nhưng điểm chuẩn gần đây cho thấy nó file_exists()nhanh hơn một chút đối với tôi. Vì vậy, tôi đoán nó phụ thuộc vào máy chủ.

Điểm chuẩn kiểm tra của tôi:

benchmark('is_file');
benchmark('file_exists');
benchmark('is_readable');

function benchmark($funcName) {
    $numCycles = 10000;
    $time_start = microtime(true);
    for ($i = 0; $i < $numCycles; $i++) {
        clearstatcache();
        $funcName('path/to/file.php'); // or 'path/to/file.php' instead of __FILE__
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "$funcName x $numCycles $time seconds <br>\n";
}

Chỉnh sửa: @Tivie cảm ơn vì nhận xét. Thay đổi số chu kỳ từ 1000 đến 10k. Kết quả là:

  1. khi tập tin tồn tại :

    is_file x 10000 1.5651218891144 giây

    file_exists x 10000 1.5016479492188 giây

    is_readable x 10000 3.7882499694824 giây

  2. khi tập tin không tồn tại :

    is_file x 10000 0.23920488357544 giây

    file_exists x 10000 0.22103786468506 giây

    is_readable x 10000 0.21929788589478 giây

Chỉnh sửa: di chuyển Clearstatcache (); bên trong vòng lặp. Cảm ơn CJ Dennis.


6
để điểm chuẩn này hoạt động, bạn nên thêm Clearstatcache (); vì các kết quả cho is_file và file_exists được lưu trong toàn bộ tập lệnh. Anyways file_exists () chậm hơn một chút, nhưng không nên tạo ra bất kỳ sự khác biệt nào trừ khi bạn thực hiện kiểm tra tệp khoảng 100K. php.net/manual/en/function.clearstatcache.php
Tivie

1
Tôi cũng đã tìm thấy is_file()nhanh hơn file_exists(). Nếu bạn biết đó là một tập tin (và không phải là một thư mục), chắc chắn sử dụng nó để thay thế.
Jonathan

1
Lạ, bây giờ có vẻ như 'file_exists' nhanh hơn 'is_file'.
weynhamz

7
Tại sao mọi người quan tâm đến cái nào nhanh hơn, bởi vì hai hàm này có các hành vi khác nhau (như được đề cập trong câu trả lời được chấp nhận, một hàm kiểm tra nếu đó là tệp hoặc liên kết tượng trưng trỏ đến tệp (nhưng không phải là thư mục và không phải là liên kết tượng trưng chỉ vào một thư mục) và các kiểm tra khác nếu đó là một tệp (cũng có thể là một thư mục).
Brandin

2
@Brandin Mọi người quan tâm vì trong nhiều tình huống bạn đã biết nếu bạn đang kiểm tra tệp hoặc thư mục, vì vậy liệu nó có tồn tại hay không là điều quan trọng duy nhất. Vì vậy, nếu is_dir()hóa ra nhanh hơn 20% so với file_exists()(mà nó không, btw), thì đó có thể là một sự khác biệt quan trọng nếu bạn chỉ kiểm tra các thư mục nào ...
Byson

1

Cũng không.

is_file () có thể trả về true nếu tệp không tồn tại.

file_exists () có thể trả về true nếu tệp là một thư mục.

Vì vậy, nếu nó cần phải là một tập tin và nó cần tồn tại thì bạn cần cả hai.

Tốc độ không thành vấn đề ở đây vì chúng không giống nhau. Chỉ sử dụng một nếu chỉ có một chức năng quan trọng và nó sẽ nhanh hơn.


0

is_filesẽ nhanh hơn nếu sử dụng nó với dấu gạch chéo ngược : \is_file. Trong trường hợp này, PHP sẽ cung cấp tối ưu hóa opcache file_exists.


0

Tôi biết bài này đã cũ nhưng sự khác biệt giữa các chức năng này không chỉ là hành vi của họ. Nếu bạn sử dụng is_file () để kiểm tra sự tồn tại của tệp lớn, hơn 2 Go. Bạn sẽ bất ngờ. Tập tin không tồn tại. :( Nhưng nếu bạn kiểm tra với file_exists (), thì nó hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.