is_file หรือ file_exists ใน PHP


118

ฉันต้องการตรวจสอบว่าไฟล์อยู่ใน HDD ในตำแหน่งที่ระบุหรือไม่ ($ path. $ file_name)

อะไรคือความแตกต่างระหว่างฟังก์ชันis_file()และfile_exists()ฟังก์ชันใดที่ดีกว่า / เร็วกว่าในการใช้ PHP?

คำตอบ:


168

is_file()จะส่งคืนfalseหากเส้นทางที่กำหนดชี้ไปยังไดเร็กทอรี file_exists()จะส่งคืนtrueหากเส้นทางที่กำหนดชี้ไปยังไฟล์หรือไดเร็กทอรีที่ถูกต้อง ดังนั้นมันจะขึ้นอยู่กับความต้องการของคุณทั้งหมด หากคุณต้องการทราบโดยเฉพาะว่าเป็นไฟล์หรือไม่ให้ใช้is_file(). file_exists()มิฉะนั้นการใช้งาน


1
เท่าที่ฉันรู้ if_file ก็ล้มเหลวสำหรับลิงก์สัญลักษณ์ไม่เพียง แต่ไดเร็กทอรี
stefs

is_file () ส่งคืน true หากไฟล์มีอยู่ในไดเร็กทอรีหรือเป็นเท็จหากไฟล์ไม่มีอยู่เนื่องจากฉันตรวจสอบในปี 2020 อาจมีการอัปเดตเวอร์ชัน php
heySushil

37

is_file()เป็นวิธีที่เร็วที่สุด แต่การเปรียบเทียบล่าสุดแสดงให้เห็นว่าfile_exists()เร็วกว่าเล็กน้อยสำหรับฉัน ดังนั้นฉันเดาว่ามันขึ้นอยู่กับเซิร์ฟเวอร์

เกณฑ์มาตรฐานการทดสอบของฉัน:

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

แก้ไข: @Tivie ขอบคุณสำหรับความคิดเห็น เปลี่ยนจำนวนรอบจาก 1,000 เป็น 10,000 ผลลัพธ์คือ:

  1. เมื่อไฟล์มีอยู่ :

    is_file x 10000 1.5651218891144 วินาที

    file_exists x 10000 1.5016479492188 วินาที

    is_readable x 10000 3.7882499694824 วินาที

  2. เมื่อไม่มีไฟล์:

    is_file x 10000 0.23920488357544 วินาที

    file_exists x 10000 0.22103786468506 วินาที

    is_readable x 10000 0.21929788589478 วินาที

แก้ไข: ย้าย clearstatcache (); ภายในวง ขอบคุณ CJ Dennis


7
เพื่อให้เกณฑ์มาตรฐานนี้ใช้งานได้คุณควรเพิ่ม clearstatcache (); เนื่องจากผลลัพธ์สำหรับ is_file และ file_exists ถูกแคชไว้ตลอดทั้งสคริปต์ Anyways file_exists () ช้ากว่าเล็กน้อย แต่ไม่ควรสร้างความแตกต่างใด ๆ เว้นแต่คุณจะทำการตรวจสอบไฟล์ประมาณ 100K php.net/manual/en/function.clearstatcache.php
Tivie

1
ฉันก็มีพบได้เร็วกว่าis_file() file_exists()หากคุณรู้ว่าเป็นไฟล์ (ไม่ใช่ไดเร็กทอรี) ให้ใช้แทน
โจนาธาน

1
แปลกตอนนี้ดูเหมือนว่า 'file_exists' จะเร็วกว่า 'is_file'
weynhamz

7
เหตุใดผู้คนจึงสนใจซึ่งเร็วกว่าเพราะทั้งสองฟังก์ชั่นมีพฤติกรรมที่แตกต่างกัน (ดังที่ได้กล่าวไว้ในคำตอบที่ยอมรับการทดสอบว่าเป็นไฟล์หรือลิงก์สัญลักษณ์ที่ชี้ไปที่ไฟล์ (แต่ไม่ใช่ไดเร็กทอรีและไม่ใช่ symlink ซึ่ง ชี้ไปที่ไดเร็กทอรี) และการทดสอบอื่น ๆ ว่าเป็นไฟล์หรือไม่ (ซึ่งอาจเป็นไดเร็กทอรีก็ได้)
Brandin

2
@Brandin ผู้คนสนใจเพราะในหลาย ๆ สถานการณ์คุณรู้อยู่แล้วว่าคุณกำลังตรวจหาไฟล์หรือไดเร็กทอรีอยู่หรือไม่ดังนั้นสิ่งที่สำคัญคือสิ่งเดียว ดังนั้นหากis_dir()ปรากฎว่าเร็วกว่า 20% file_exists()(ซึ่งมันไม่ได้ btw) นั่นอาจเป็นความแตกต่างที่สำคัญหากคุณกำลังตรวจสอบ dirs อยู่แล้ว ...
Byson

2

ทั้ง

is_file () สามารถคืนค่า true ถ้าไม่มีไฟล์

file_exists () สามารถคืนค่า true หากไฟล์เป็นไดเร็กทอรี

ดังนั้นหากจำเป็นต้องเป็นไฟล์และจำเป็นต้องมีอยู่คุณต้องมีทั้งสองอย่าง

ความเร็วไม่สำคัญที่นี่เพราะพวกเขาไม่เหมือนกัน ใช้เพียงฟังก์ชันเดียวหากมีเพียงฟังก์ชันเดียวเท่านั้นที่สำคัญและจะเร็วขึ้น


1

ฉันรู้ว่าโพสต์นี้เก่า แต่ความแตกต่างระหว่างฟังก์ชันนี้ไม่ใช่แค่พฤติกรรมของพวกเขาเท่านั้น หากคุณใช้ is_file () เพื่อตรวจสอบการมีอยู่ของไฟล์ขนาดใหญ่มากกว่า 2 Go คุณจะต้องประหลาดใจ ไม่มีไฟล์ :( แต่ถ้าคุณตรวจสอบด้วย file_exists () ก็ใช้ได้


0

is_file\is_fileจะเร็วขึ้นถ้าใช้มันด้วยเครื่องหมายทับขวา: ในกรณีนี้ PHP จะให้การเพิ่มประสิทธิภาพ opcache และfile_existsไม่ทำเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.