PHP'de is_file veya file_exists


117

Bir dosyanın HDD'de belirli bir konumda ($ yol. $ Dosya_adı) olup olmadığını kontrol etmem gerekiyor.

is_file()Ve file_exists()işlevleri arasındaki fark nedir ve PHP'de hangisi daha iyi / daha hızlı kullanılır?

Yanıtlar:


167

is_file()falseverilen yol bir dizini gösteriyorsa geri döner . verilen yol geçerli bir dosya veya dizini gösteriyorsa file_exists()dönecektir . Yani tamamen ihtiyaçlarınıza bağlı olacaktır. Bunun bir dosya olup olmadığını özellikle bilmek istiyorsanız , kullanın . Aksi takdirde kullanın .trueis_file()file_exists()


1
Bildiğim kadarıyla, if_file sadece dizinler için değil, sembolik bağlantılar için de başarısız oluyor.
stefs

is_file (), dosya dizinde mevcutsa doğru veya dosya yoksa yanlış, 2020'de kontrol ettiğimde php sürümü güncellemesi olabilir
heySushil

37

is_file()en hızlısıdır, ancak son karşılaştırmalar bunun file_exists()benim için biraz daha hızlı olduğunu gösteriyor . Sanırım sunucuya bağlı.

Test karşılaştırmam:

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";
}

Düzenleme: @Tivie yorum için teşekkürler. Döngü sayısı 1000'den 10k'ye değiştirildi. Sonuç:

  1. dosya mevcut olduğunda :

    is_file x 10000 1.5651218891144 saniye

    file_exists x 10000 1.5016479492188 saniye

    is_readable x 10000 3.7882499694824 saniye

  2. dosya yoksa :

    is_file x 10000 0.23920488357544 saniye

    file_exists x 10000 0.22103786468506 saniye

    is_readable x 10000 0.21929788589478 saniye

Düzen: clearstatcache () taşındı; döngünün içinde. Teşekkürler CJ Dennis.


7
bu karşılaştırmanın çalışması için, clearstatcache () eklemeniz gerekir; is_file ve file_exists için sonuçlar komut dosyası boyunca önbelleğe alındığından. Her neyse, file_exists () biraz daha yavaştır, ancak yaklaşık 100K dosya denetimi yapmadığınız sürece herhangi bir fark yaratmamalıdır. php.net/manual/en/function.clearstatcache.php
Tivie

1
Ben de is_file()daha hızlı buldum file_exists(). Bunun bir dosya olduğunu (ve bir dizin olmadığını) biliyorsanız, kesinlikle onun yerine kullanın.
Jonathan

1
Garip, şimdi 'file_exists' 'is_file'dan daha hızlı görünüyor.
weynhamz

7
Neden insanlar hangisinin daha hızlı olduğu ile ilgileniyorlar, çünkü bu iki işlev farklı davranışlara sahip (kabul edilen cevapta belirtildiği gibi, bir dosyaya işaret eden bir dosya veya sembolik bağ olup olmadığını test eder (ancak bir dizin değil, sembolik bağ değil) bir dizini gösterir) ve diğer bir dosya olup olmadığını test eder (aynı zamanda bir dizin de olabilir).
Brandin

2
@Brandin İnsanlar ilgileniyor çünkü birçok durumda bir dosya veya dizini kontrol edip etmediğinizi zaten biliyorsunuz , bu yüzden var olup olmadığı tek önemli şey. Yani, eğer is_dir()bundan% 20 daha hızlı çıkarsa file_exists()(ki öyle değil, btw), bu sadece yine de
dirleri

2

Ne.

is_file () dosya yoksa true döndürebilir.

file_exists (), dosya bir dizinse true döndürebilir.

Yani bir dosya olması gerekiyorsa ve var olması gerekiyorsa ikisine de ihtiyacınız var.

Burada hız önemli değil çünkü aynı değiller. Yalnızca bir işlev önemliyse ve daha hızlı olacaksa yalnızca birini kullanın.


1

Bu yazının eski olduğunu biliyorum ama bu işlevler arasındaki fark sadece davranışları değil. Büyük dosyanın varlığını kontrol etmek için is_file () kullanırsanız, 2'den fazla gidin. Sürpriz olacaksın. Dosya mevcut değil. :( Ancak file_exists () ile kontrol ederseniz, bu işe yarar.


0

is_fileters eğik çizgi ile kullanım bunu eğer daha hızlı olacaktır: \is_file. Bu durumda PHP, opcache optimizasyonu sağlayacak ve sağlamayacaktır file_exists.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.