1. 概要
「PHP」は、そもそもウェブページ生成のために作成された言語でありまして。
最終的な実行は、ウェブサーバ上になります。
ウェブサーバで動作しているので、デバッガをかますこともできず・・・。
デバッグするのは、なかなか大変で・・・。
本ページは、下記のサイトを参考にさせていただきました。
「PHP: debug_backtrace - Manual」
「PHP で Backtrace を出力する」
2. debug_backtrace バックトレースを生成する
実行の際は、複雑怪奇な呼び出しになっていたりするので、どこから呼ばれているのかがわからないことも多々あります。
その際に、これは、有効な手段となります。
debug_backtrace ( int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT , int $limit = 0 ) : array
参考サイトで言っているように、一般には、「Stack Trace」と言っているような気がします。
デバック個所のトレースを取得してくれます。
参考サイトのいうように。
<?php
function foo()
{
$trace = debug_backtrace();
print_r($trace);
}
function bar()
{
foo();
}
bar();
と書いて、「print_r」で出力しても。
Array
(
[0] => Array
(
[file] => /home/hogehoge/lang/php/function/function01.php
[line] => 10
[function] => foo
[args] => Array
(
)
)
[1] => Array
(
[file] => /home/hogehoge/lang/php/function/function01.php
[line] => 13
[function] => bar
[args] => Array
(
)
)
)
だらだらと不要なものを出力してしまいますので。
<?php
function foo()
{
$trace = debug_backtrace();
foreach($trace as $line)
{
print("{$line["file"]}: line {$line["line"]}\n");
}
}
function bar()
{
foo();
}
bar();
と書いた方が、デバックは、しやすいかな。
こんな出力になります。
/home/hogehoge/lang/php/function/function02.php: line 14
/home/hogehoge/lang/php/function/function02.php: line 17
もちろん、ウェブ上に配置する際は、上記のように、「print」で出力するのえではなく、下記のように、「error_log」で出力します。
<?php
function foo()
{
$trace = debug_backtrace();
foreach($trace as $line)
{
error_log("{$line["file"]}: line {$line["line"]}");
}
}
function bar()
{
foo();
}
bar();
3. Laravel 上で
「Laravel」の場合、基本的に、ウェブサーバのログでも、「PHP」のログでもないところに出力します。
/project path/storage/logs/laravel.log
ですな。
なので、この中に混ぜ込みたい。
ヘッダ部に、下記の行をいれて。
use Illuminate\Support\Facades\Log;
スタックトレースを出力したい箇所に、下記の行を記述します。
Log::debug(__FILE__." ".__FUNCTION__." ".__LINE__);
$trace = debug_backtrace();
foreach($trace as $line)
{
Log::debug("{$line["file"]}: line {$line["line"]}");
}