is_file atau file_exists di PHP

117

Saya perlu memeriksa apakah file ada di HDD di lokasi yang ditentukan ($ path. $ File_name).

Apa perbedaan antara is_file()and file_exists()functions dan mana yang lebih baik / lebih cepat digunakan di PHP?

Duncan Benoit
sumber

Jawaban:

167

is_file()akan kembali falsejika jalur yang diberikan menunjuk ke direktori. file_exists()akan kembali truejika jalur yang diberikan menunjuk ke file atau direktori yang valid . Jadi itu akan tergantung sepenuhnya pada kebutuhan Anda. Jika Anda ingin mengetahui secara spesifik apakah itu file atau bukan, gunakan is_file(). Jika tidak, gunakan file_exists().

hbw
sumber
1
Sejauh yang saya tahu, if_file juga gagal untuk tautan simbolik, tidak hanya direktori.
Stefs
is_file () mengembalikan true jika file ada di direktori atau false jika file tidak ada karena saya memeriksa pada tahun 2020 mungkin versi php memperbaruinya
heySushil
37

is_file()adalah yang tercepat, tetapi benchmark terbaru menunjukkan yang file_exists()sedikit lebih cepat bagi saya. Jadi saya rasa itu tergantung pada servernya.

Tolok ukur pengujian saya:

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 terima kasih atas komentarnya. Jumlah siklus diubah dari 1000 menjadi 10k. Hasilnya adalah:

  1. ketika file tersebut ada :

    is_file x 10000 1,5651218891144 detik

    file_exists x 10000 1,5016479492188 detik

    dapat dibaca x 10000 3,7882499694824 detik

  2. ketika file tidak ada :

    is_file x 10000 0,23920488357544 detik

    file_exists x 10000 0,22103786468506 detik

    dapat dibaca x 10000 0,21929788589478 detik

Edit: pindah clearstatcache (); di dalam lingkaran. Terima kasih CJ Dennis.

Lamy
sumber
7
agar benchmark ini bekerja, Anda harus menambahkan clearstatcache (); karena hasil untuk is_file dan file_exists di-cache di seluruh skrip. Bagaimanapun file_exists () sedikit lebih lambat, tetapi seharusnya tidak membuat perbedaan apa pun kecuali Anda melakukan sekitar 100K pemeriksaan file. php.net/manual/en/function.clearstatcache.php
Tivie
1
Saya juga telah menemukan is_file()lebih cepat dari file_exists(). Jika Anda tahu itu adalah file (dan bukan direktori), gunakan saja.
Jonathan
1
Aneh, sekarang sepertinya 'file_exists' lebih cepat daripada 'is_file'.
weynhamz
7
Mengapa orang tertarik yang lebih cepat, karena kedua fungsi ini memiliki perilaku yang berbeda (seperti yang disebutkan dalam jawaban yang diterima, yang menguji apakah itu file atau symlink yang menunjuk ke file (tetapi bukan direktori dan bukan symlink yang menunjuk ke direktori) dan tes lainnya jika itu adalah file (yang juga bisa menjadi direktori).
Brandin
2
@Brandin Orang-orang tertarik karena dalam banyak situasi Anda sudah tahu apakah Anda sedang memeriksa file atau direktori, jadi apakah itu ada satu-satunya hal yang penting. Jadi jika is_dir()ternyata 20% lebih cepat dari file_exists()(yang tidak, btw), itu bisa menjadi perbedaan penting jika Anda hanya memeriksa dirs ...
Byson
2

Tidak keduanya.

is_file () dapat mengembalikan nilai true jika file tidak ada.

file_exists () dapat mengembalikan nilai true jika file tersebut adalah direktori.

Jadi jika perlu file dan perlu ada maka Anda memerlukan keduanya.

Kecepatan tidak menjadi masalah di sini karena keduanya tidak sama. Gunakan hanya satu jika hanya satu fungsi yang penting dan itu akan lebih cepat.

Brad
sumber
1

Saya tahu posting ini sudah tua tetapi perbedaan antara fungsi ini tidak hanya pada perilakunya. Jika Anda menggunakan is_file () untuk memeriksa keberadaan file besar, lebih dari 2 Go. Anda akan terkejut. File tidak ada. :( Tetapi jika Anda memeriksa dengan file_exists (), itu berhasil.

Juan - 6510866
sumber
0

is_fileakan lebih cepat jika menggunakan dengan backslash: \is_file. Dalam hal ini PHP akan memberikan optimasi opcache dan tidak file_existsjuga tidak.

Pria Berduri
sumber