GORAGOD.com

การใช้ @ ป้องกัน error ในกรณีที่ไม่พบไฟล์

บทความนี้เกิดขึ้นจากความสงสัยในการใช้งาน @ เพื่อป้องกัน error ในการเปิดไฟล์ หรือการ include ซึ่งข้อสงสัยของผมก็คือ ระหว่างการทดสอบไฟล์ว่ามีหรือไม่ก่อนการโหลด กับการ ใช้ @ เพื่อปิดการแสดง error แบบไหนจะเร็วกว่ากัน

โค้ดสำหรับทดสอบของผม ส่วนที่ 1

@include('xxx.php')

และ ส่วนที่ 2

if (is_file('xxx.php')) {
     include('xxx.php');
}

ในกรณีของส่วนที่ 1 ผมได้ใช้ @ เพื่อปิด error ในกรณีที่ไม่ไม่พบไฟล์ xxx.php ซึ่งในบางครั้งเราอาจต้องการ include ไฟล์ที่ไม่มีอยู่จริงก็ได้ และ ในส่วนที่ 2 ผมใช้การทดสอบไฟล์ก่อนด้วย is_file() ถ้ามีก็ค่อยไปโหลดไฟล์

กรณีทดสอบที่ 1 ทำการทดสอบวนลูป 1000 ครั้งกับไฟล์ xxx.php ที่มีอยู่จริง ผลลัพท์คือ

ส่วนที่ 1 @include('xxx.php')
เวลาที่ใช้ในการประมวลผลเพจ 0.3203668594 วินาที

ส่วนที่ 2 is_file('xxx.php')
เวลาที่ใช้ในการประมวลผลเพจ 0.3196368217 วินาที

กรณีทดสอบที่ 2 ทำการทดสอบวนลูป 1000 ครั้งเช่นกัน แต่ไม่มีไฟล์ xxx.php

ส่วนที่ 1 @include('xxx.php')
เวลาที่ใช้ในการประมวลผลเพจ 1.9867811203 วินาที

ส่วนที่ 2 is_file('xxx.php')
เวลาที่ใช้ในการประมวลผลเพจ 0.3470931053 วินาที

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

แต่อย่างไรก็ตาม จากการทดสอบซ้ำหลายๆรอบ ผลการทดสอบในกรณีที่มีไฟล์ ในบางครั้ง การใช้ @ กลับทำเวลาได้ดีกว่า(เล็กน้อย)

<?php
    // เริ่มต้นการใช้งาน แทรกส่วนนี้ไว้ตอนต้นๆของเพจ ก่อนการประมวลผล
    include( 'timer.php' );
    $bm = new Timer; // เรียกใช้งาน class
    $bm->start(); // เริ่มต้นจับเวลา
?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<p>ส่วนที่ 1 @include('xxx.php')</p>
<p>
<?php
    // section 1 โหลดไฟล์โดยใช้ @ ป้องกัน error กรณีที่ไม่พบไฟล์
    for ($i = 0 ; $i < 1000 ; $i++){
        @include('xxx.php');
    }
?>
</p>
<?php
    echo 'เวลาที่ใช้ในการประมวลผลเพจ '.$bm->stop(). ' วินาที'; // แสดงเวลาที่ใช้ไป

    $bm = new Timer; // เรียกใช้งาน class
    $bm->start(); // เริ่มต้นจับเวลา
?>
<p>ส่วนที่ 2 is_file('xxx.php')</p>
<p>
<?php
    // section 2 ใช้การทดสอบไฟล์ก่อนโหลด
    for ($i = 0 ; $i < 1000 ; $i++){
        if (is_file('xxx.php')) {
            include('xxx.php');
        }
    }
?>
</p>
<?php
    echo 'เวลาที่ใช้ในการประมวลผลเพจ '.$bm->stop(). ' วินาที'; // แสดงเวลาที่ใช้ไป
?>

ด้านบนเป็นโค้ดที่ผมใช้ทดสอบ