လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHPCONESSATE Information ကိုရရှိရန် GetTrace function ကိုအသုံးပြုသောအခါအကောင်းဆုံးအလေ့အကျင့်များနှင့်သိကောင်းစရာများကဘာတွေလဲ။

PHPCONESSATE Information ကိုရရှိရန် GetTrace function ကိုအသုံးပြုသောအခါအကောင်းဆုံးအလေ့အကျင့်များနှင့်သိကောင်းစရာများကဘာတွေလဲ။

gitbox 2025-09-08

1 ။ GetTrace () function ကို၏အခြေခံ

GetTrace () သည် PHP တွင် throwable interface ၏အစိတ်အပိုင်းတစ်ခုဖြစ်သည်။ ၎င်းသည်ခင်းကျင်းမှုတစ်ခုသို့ပြန်လည်ရောက်ရှိပြီး Array ၏ element တစ်ခုစီသည်ခြွင်းချက်များဖြစ်ပေါ်သည့်အခါ stack ရှိ frame ကိုကိုယ်စားပြုသည်။ frame တစ်ခုစီတွင်ခေါ်ဆိုမှု၏ဖိုင်, လိုင်းနံပါတ်, function name name, parameters များစသည့် function call of function ခေါ်ဆိုမှုနှင့်ပတ်သက်သည့်အသေးစိတ်အချက်အလက်များပါရှိသည်။

ရိုးရှင်းသောဥပမာ -

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Something went wrong'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>());
}
</span></span>

ရလဒ်ရလဒ်မှာ -

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [file] =&gt; /path/to/file.php
            [line] =&gt; </span><span><span class="hljs-number">12</span></span><span>
            [function] =&gt; someFunction
            [args] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
                (
                    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-string">"argument"</span></span><span>
                )
        )
)
</span></span>

ဤသည်ခင်းကျင်းသည်ခြွင်းချက်များဖြစ်ပေါ်သည့်အခါ stack အချက်အလက်များကိုပြသသည်။ Element တစ်ခုစီတွင် function ကိုခေါ်သည့်အခါဖိုင်လမ်းကြောင်း, လိုင်းနံပါတ်, function name နှင့် parameters များကိုပါရှိသည်။


2 ။ ပုံနှိပ်သတင်းအချက်အလက်ပုံနှိပ်သည့်အခါ output ကို format လုပ်ပါ

အထူးသဖြင့် function calls များစွာသည်ပိုမိုနက်ရှိုင်းသည့်အခါ stack အချက်အလက်များ၏မူလထုတ်လုပ်မှုသည်ပိုရှည်နိုင်သည်။ လွယ်ကူသောကြည့်ရှုခြင်းနှင့်ခွဲခြမ်းစိတ်ဖြာမှုအတွက် stack အချက်အလက်များ၏ output ကို format လုပ်ရန်များသောအားဖြင့်လိုအပ်သည်။ Print_r () () သို့မဟုတ် var_dump () ကိုသုံးနိုင်သည်။

ဥပမာအားဖြင့်, အောက်ပါကုဒ်ပုံနှိပ်ခြင်းသည်သတင်းအချက်အလက်များကိုပြန်လည်ပြင်ဆင်ထားသောလုပ်ဆောင်ချက်များမှတဆင့်သတင်းအချက်အလက်များကိုပိုမိုဖတ်ရှုနိုင်သည့်ပုံစံဖြင့်ပုံသွင်းသည်။

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">printTrace</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$trace</span></span></span><span>) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$trace</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> =&gt; </span><span><span class="hljs-variable">$frame</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"#<span class="hljs-subst">{$index}</span></span></span><span> </span><span><span class="hljs-subst">{$frame['file']}</span></span><span>(</span><span><span class="hljs-subst">{$frame['line']}</span></span><span>): ";
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$frame</span></span><span>[</span><span><span class="hljs-string">'class'</span></span><span>])) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">{$frame['class']}</span></span></span><span><span class="hljs-subst">{$frame['type']}</span></span><span>";
        }
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">{$frame['function']}</span></span></span><span>(";
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">', '</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$arg</span></span><span>) { </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">var_export</span></span><span>(</span><span><span class="hljs-variable">$arg</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); }, </span><span><span class="hljs-variable">$frame</span></span><span>[</span><span><span class="hljs-string">'args'</span></span><span>]));
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">")\n"</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Test Exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">printTrace</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>());
}
</span></span>

ဤ output method သည်ပြ problems နာများပိုမိုရှုပ်ထွေးသော applications များကို debging လုပ်သည့်အခါတွင်ဤ output ကိုပိုမိုလွယ်ကူစေသည်။


3 ။ အပြည့်အဝ stack သတင်းအချက်အလက်ကိုရယူပါ: GetTraceasString ()

GetTrace () function သည်ခင်းကျင်းမှုတစ်ခုဖြစ်သော်လည်းတစ်ခါတစ်ရံတွင်ကျွန်ုပ်တို့သည် GetRaceasString () function ကိုအသုံးပြုရန်အသုံးပြုနိုင်သည်။ ဤနည်းလမ်းသည်သတင်းအချက်အလက်များကိုဖတ်နိုင်သော string တစ်ခုထဲသို့ပြောင်းလဲပြီးအလွယ်တကူမှတ်တမ်းဖိုင်သို့အလွယ်တကူမှတ်တမ်းတင်နိုင်သည်။

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'An error occurred'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span>

output နှင့်ဆင်တူသည်:

 <span><span><span class="hljs-selector-id">#0</span></span><span> /path/</span><span><span class="hljs-selector-tag">to</span></span><span>/file</span><span><span class="hljs-selector-class">.php</span></span><span>(</span><span><span class="hljs-number">15</span></span><span>): </span><span><span class="hljs-built_in">someFunction</span></span><span>()
#</span><span><span class="hljs-number">1</span></span><span> /path/to/file.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">18</span></span><span>): </span><span><span class="hljs-built_in">anotherFunction</span></span><span>()
#</span><span><span class="hljs-number">2</span></span><span> /path/to/file.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">22</span></span><span>): </span><span><span class="hljs-built_in">mainFunction</span></span><span>()
</span></span>

ဤပုံစံသည်အထူးသဖြင့်အမှားမှတ်တမ်းတွင်ပြည့်စုံသော stack အချက်အလက်များကိုမှတ်တမ်းတင်ရန်နှင့်နောက်ဆက်တွဲအမှားခွဲခြမ်းစိတ်ဖြာမှုကိုလွယ်ကူချောမွေ့စေသည်။


4 ။ အတိမ်အနက်ကိုထိန်းချုပ်

ရှုပ်ထွေးသော application များတွင် stack အချက်အလက်သည်အလွန်ကြီးမားနိုင်သည်, ကြီးမားသော stack အချက်အလက်များကိုထုတ်ယူခြင်းကိုရှောင်ရှားရန်သင်သည်အထပ်အနက်ကိုထိန်းချုပ်ခြင်းအားဖြင့်အရေးအကြီးဆုံး stack frames များကိုသာထုတ်လုပ်နိုင်သည်။

ဥပမာအားဖြင့်:

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Another test exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_slice</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>(), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>);  </span><span><span class="hljs-comment">// ပထမသုံး stack frames သာ output ကိုဖြစ်ကြသည်</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$trace</span></span><span>);
}
</span></span>

ဤနည်းအားဖြင့် developer များကသတင်းအချက်အလက် overload ကိုရှောင်ရှားရန် stack ၏ပထမဆုံးအရေးကြီးသောဘောင်အနည်းငယ်ကိုသာရှုမြင်နိုင်သည်။


5 ။ သစ်ထုတ်လုပ်ရေးကိရိယာများနှင့်အတူပေါင်းစပ်

သစ်ထုတ်လုပ်ရေးသတင်းအချက်အလက်များကိုမှတ်တမ်းဖိုင်များသို့ဖွဲ့စည်းခြင်းအချက်အလက်များသည်ပုံမှန်အားဖြင့် debugging လိုအပ်ချက်ဖြစ်သည်။ ထုတ်လုပ်မှုပတ် 0 န်းကျင်တွင် PHP developer များသည်နောက်ဆက်တွဲခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်ခြွင်းချက်စာရင်းကိုမှတ်တမ်းတင်ရန် PHP developer များ ( monolog ကဲ့သို့သောကိရိယာများ) ကိုပေါင်းစပ်ရန်။

ဥပမာအားဖြင့်, monolog ကို stack အချက်အလက်များကိုမှတ်တမ်းတင်ရန်ပေါင်းစပ်ပါ။

 <span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Monolog</span></span><span>\</span><span><span class="hljs-title">Logger</span></span><span>;
</span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Monolog</span></span><span>\</span><span><span class="hljs-title">Handler</span></span><span>\</span><span><span class="hljs-title">StreamHandler</span></span><span>;

</span><span><span class="hljs-variable">$log</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Logger</span></span><span>(</span><span><span class="hljs-string">'exception_log'</span></span><span>);
</span><span><span class="hljs-variable">$log</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">pushHandler</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">StreamHandler</span></span><span>(</span><span><span class="hljs-string">'path/to/logfile.log'</span></span><span>, </span><span><span class="hljs-title class_">Logger</span></span><span>::</span><span><span class="hljs-variable constant_">ERROR</span></span><span>));

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Logging exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$log</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">error</span></span><span>(</span><span><span class="hljs-string">'Exception occurred'</span></span><span>, [</span><span><span class="hljs-string">'exception'</span></span><span> =&gt; </span><span><span class="hljs-variable">$e</span></span><span>]);
}
</span></span>

ဤနည်းအားဖြင့်ချွင်းချက် stack အချက်အလက်များကိုပိုမိုလွယ်ကူစွာခြေရာခံခြင်းနှင့်ခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်မှတ်တမ်းဖိုင်တွင်မှတ်တမ်းတင်နိုင်သည်။


6 ။ ထုံးစံခြွင်းချက်အတန်းကိုသုံးပါ

အချို့ဖြစ်ရပ်များတွင် PHP ၏ built-in ခြွင်းချက် အတန်းအစားကိုအသုံးပြုခြင်းသည်အလုံအလောက်ပြောင်းလွယ်ပြင်လွယ်ရှိနိုင်သည်။ ပိုမိုကောင်းမွန်သောစီမံခန့်ခွဲရန် developer များက developer များကစိတ်ကြိုက်ချွင်းချက်အတန်းများကို ဖန်တီး. GetTrace () ၏လုပ်ဆောင်နိုင်မှုကိုတိုးချဲ့နိုင်သည်။ ဥပမာအားဖြင့်တိကျသောအခြေအနေတွင်သတင်းအချက်အလက်များကိုမှတ်တမ်းတင်ထားနိုင်သော်လည်းသတင်းအချက်အလက်များကိုတိကျသောပုံစံများဖြင့်ဖွဲ့စည်းနိုင်သည်။

 <span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MyCustomException</span></span><span> </span><span><span class="hljs-keyword">extends</span></span><span> </span><span><span class="hljs-title">Exception</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getCustomTrace</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
        </span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>();
        </span><span><span class="hljs-comment">// Custom Logic ကိုဤနေရာတွင်ထည့်နိုင်သည်,ဥပမာအားဖြင့်နောက်ထပ်အကြောင်းအရာသတင်းအချက်အလက်မှတ်တမ်း</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$trace</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MyCustomException</span></span><span>(</span><span><span class="hljs-string">'Custom exception occurred'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (MyCustomException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getCustomTrace</span></span><span>());
}
</span></span>

ထုံးစံခြွင်းချက်အတန်းများသည် code ကိုပိုမိုအရွယ်အစားဆွဲနိုင်ပြီးလိုအပ်သည့်အခါပိုမိုတိကျသော stack အချက်အလက်သို့မဟုတ်ယုတ္တိဗေဒကိုထည့်သွင်းနိုင်သည်။


7 ။ စွမ်းဆောင်ရည်နှင့်အထိခိုက်မခံသောသတင်းအချက်အလက်များကိုအာရုံစိုက်ပါ

GetTrace () သည်အလွန်အသုံးဝင်သော debugging tool တစ်ခုဖြစ်သော်လည်းထုတ်လုပ်မှုပတ် 0 န်းကျင်တွင် stack သတင်းအချက်အလက်များကိုမကြာခဏထုတ်ယူခြင်းသည်အထူးသဖြင့်တစ်ပြိုင်နက်တည်းကစနစ်တကျစနစ်များကိုဖြစ်ပေါ်စေသည်။ ထို့ကြောင့် developer များက၎င်းကို Package Password များ, အသုံးပြုသူအချက်အလက်များစသည်တို့ကို (ဥပမာဒေတာဘေ့စ်စကားဝှက်များစသည်တို့) အတွက်အလွန်အကျွံမှတ်တမ်းတင်ခြင်းမှရှောင်ရှားရန်ထုတ်လုပ်မှုပတ်ဝန်းကျင်တွင်သတိထားသင့်ပြီးဤအချက်အလက်ကိုပေါက်ကြားလိမ့်မည်မဟုတ်ပါ။

ဘုံအလေ့အကျင့်တစ်ခုသည်ပတ် 0 န်းကျင်အပေါ် အခြေခံ. အသေးစိတ် stack မှတ်တမ်းများကိုဖွင့်ရှုခြင်းရှိမရှိဆုံးဖြတ်ရန်ဖြစ်သည်။

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getenv</span></span><span>(</span><span><span class="hljs-string">'APP_ENV'</span></span><span>) !== </span><span><span class="hljs-string">'production'</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span>

ထုတ်လုပ်မှုပတ် 0 န်းကျင်များတွင်မှားယွင်းသောသတင်းအချက်အလက်များကိုသာစနစ်စွမ်းဆောင်ရည်နှင့်လုံခြုံရေးကိုတိုးတက်စေရန်သာမှတ်တမ်းတင်ထားသည်။