2009-04-27 34 views

Trả lời

132

is_file() sẽ trả lại false nếu đường dẫn đã cho trỏ đến một thư mục. file_exists() sẽ trả lại true nếu đường dẫn cụ thể trỏ đến một tệp hợp lệ hoặc. 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ể nếu đó là tệp hay không, hãy sử dụng is_file(). Nếu không, hãy sử dụng file_exists().

+1

theo như tôi biết, if_file cũng không thành công cho các liên kết tượng trưng, ​​không chỉ các thư mục. – stefs

+36

Chỉ cần chạy một thử nghiệm nhanh chóng, và nó thực sự giải quyết các liên kết tượng trưng. – hbw

30

is_file() là điểm chuẩn nhanh nhất nhưng gần đây cho thấy rằng 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ủ.

chuẩn thử nghiệm 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"; 
} 

Edit: @Tivie cảm ơn cho 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 không tồn tại:

    is_file x 10000 ,23920488357544 giây

    file_exists x 10000 ,22103786468506 giây

    is_readable x 10000 ,21929788589478 giây

Edit: chuyển clearstatcache(); bên trong vòng lặp. Cảm ơn CJ Dennis.

+5

để chuẩn này hoạt động, bạn nên thêm clearstatcache(); kể từ khi kết quả cho is_file và file_exists được lưu trữ trong suốt tập lệnh. Anyways file_exists() là một chút chậm hơn, nhưng không nên thực hiện bất kỳ sự khác biệt, trừ khi bạn thực hiện kiểm tra khoảng 100K tập tin. http://www.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

Rất tiếc, giờ có vẻ 'file_exists' nhanh hơn 'is_file'. – weynhamz