Tag Archive line

PHP: ดูการทำงานสร้าง flowchart (backtrace)

ถ้าเรียนเขียน program มาคงจะคุ้นเคยกับ flowchart การทำงานของของโปรแกรม แต่ในชีวิตการทำงานจริงๆ โดยเฉพาะถ้าเขียน code โดยใช้ framework ต่างๆ จะไม่เป็นเหมือนที่ได้ออกแบบไว้เสมอไป เพราะว่าบางครั้งโปรแกรมจะทำงานให้เราเองโดยที่ไม่ได้สั่ง สาเหตุคือ มีการเรียกใช้ hook หรือ tricker ทำให้เกิด process ที่อาจจะไม่ทราบที่มา หรือต้องมาแก้งานของคนอื่นโดนที่ไม่มีเอกสารให้

นอกจากการใช้วิธี PHP: list included หรือ required ไฟล์ที่ใช้ ถ้าเราใช้ตัว framework ต่างๆ มักจะมีการเตรียม function ในการสร้าง backtrace ไว้ให้ แต่ถ้าไม่มีหรือเป็น code ที่เขียนด้วยตัวเอง ยังสามารถใช้ debug_backtrace ในการค้นหาที่มาที่ไปได้เช่น

<?php

function getBacktrace()
{
    $backtrace = debug_backtrace();
    echo '<pre>', print_r($backtrace, true), '</pre>';
    fwrite(fopen('logs_debug_backtrace.txt', 'a+'), "\n\n" . __FILE__ . ' :' . __LINE__ . "\n\n" . print_r($backtrace, true));
}

function getPhpInfo($what)
{
    phpinfo($what);

    /* จะดูว่า ทำไม่ getPhpInfo ถึงทำงาน */
    getBacktrace();
}

function index()
{
    getPhpInfo(INFO_ENVIRONMENT);
}

index();

เมื่อทดสอบดูจะได้ผลลัพธ์

Array
(
    [0] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 13
            [function] => getBacktrace
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 18
            [function] => getPhpInfo
            [args] => Array
                (
                    [0] => 16
                )

        )

    [2] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 21
            [function] => index
            [args] => Array
                (
                )

        )

)

เพราะว่าเราเขียน function debug_backtrace() ไว้ใน function getBacktrace() อีกชั้น เพื่อที่ความง่ายในการค้นหา flow เมื่อต้องการดูว่า function หรือ class ที่เราสนใจมันมี flow มายังไงก็แค่ไปเรียกใน function ที่สงสัย เราก็จะได้ลำดับการทำงานย้อนกลับไป เราจะได้ทราบทั้งฟังก์ชั้น คลาส บรรทัด ไฟล์ แม้แต่ตัวแปรที่ส่งเข้าไปใน function นั้นๆ