PHP : 함수가 어디에서 호출되었는지 확인
PHP의 함수가 어디에서 호출되었는지 알아내는 방법이 있습니까? 예:
function epic()
{
fail();
}
function fail()
{
//at this point, how do i know, that epic() has called this function?
}
사용할 수 있습니다 debug_backtrace()
.
예:
<?php
function epic( $a, $b )
{
fail( $a . ' ' . $b );
}
function fail( $string )
{
$backtrace = debug_backtrace();
print_r( $backtrace );
}
epic( 'Hello', 'World' );
산출:
Array
(
[0] => Array
(
[file] => /Users/romac/Desktop/test.php
[line] => 5
[function] => fail
[args] => Array
(
[0] => Hello World
)
)
[1] => Array
(
[file] => /Users/romac/Desktop/test.php
[line] => 15
[function] => epic
[args] => Array
(
[0] => Hello
[1] => World
)
)
)
function fail()
{
$backtrace = debug_backtrace();
// Here, $backtrace[0] points to fail(), so we'll look in $backtrace[1] instead
if (isset($backtrace[1]['function']) && $backtrace[1]['function'] == 'epic')
{
// Called by epic()...
}
}
내가 찾은 가장 빠르고 간단한 솔루션
public function func() { //function whose call file you want to find
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
}
$trace: Array
(
[0] => Array
(
[file] => C:\wamp\www\index.php
[line] => 56
[function] => func
[class] => (func Class namespace)
[type] => ->
)
)
Lenovo 노트북에서 속도를 테스트했습니다 : Intel Pentiom CPU N3530 2.16GHz, RAM 8GB
global $times;
$start = microtime(true);
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
$times[] = microtime(true) - $start;
결과 :
count($times): 97
min: 2.6941299438477E-5
max: 10.68115234375E-5
avg: 3.3095939872191E-5
median: 3.0517578125E-5
sum: 321.03061676025E-5
the same results with notation without E-5
count($times): 97
min: 0.000026941299438477
max: 0.0001068115234375
avg: 0.000033095939872191
median: 0.000030517578125
sum: 0.0032103061676025
따라서 여전히 방법을 모른다면 여기보다 해결책이 있습니다.
$backtrace = debug_backtrace();
echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!';
debug_backtrace 함수 사용 : http://php.net/manual/en/function.debug-backtrace.php
아래 코드를 시도하십시오.
foreach(debug_backtrace() as $t) {
echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()<br/>";
}
스택 맨 위에서 호출의 정확한 출처를 추적하려면 다음 코드를 사용할 수 있습니다.
$call_origin = end(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
이것은 연결된 함수를 무시하고 가장 관련성이 높은 호출 정보 만 가져옵니다 (relevant는 수행하려는 작업에 따라 느슨하게 사용됨).
function findFunction($function, $inputDirectory=""){
//version 0.1
$docRoot = getenv("DOCUMENT_ROOT");
$folderArray = null;
$dirArray = null;
// open directory
$directory = opendir($docRoot.$inputDirectory);
// get each entry
while($entryName = readdir($directory)) {
if(is_dir($entryName) && $entryName != "." && $entryName != ".."){
$folderArray[] = str_replace($inputDirectory, "", $entryName);
}
$ext = explode(".", $entryName);
if(!empty($ext[1])){
$dirArray[] = $docRoot.$inputDirectory."/".$entryName;
}
}
// close directory
closedir($directory);
$found = false;
if(is_array($dirArray)){
foreach($dirArray as $current){
$myFile = file_get_contents($current);
$myFile = str_replace("<?php", "", $myFile);
$myFile = str_replace("?>", "", $myFile);
if(preg_match("/function ".$function."/", $myFile)){
$found = true;
$foundLocation = $current;
break;
}
}
}
if($found){
echo $foundLocation;
exit;
} else if(is_array($folderArray)){
foreach($folderArray as $folder){
if(!isset($return)){
$return = findFunction($function, $inputDirectory."/".$folder);
} else if($return == false){
$return = findFunction($function, $inputDirectory."/".$folder);
}
}
} else {
return false;
}
}
findFunction("testFunction", "rootDirectory");
Hope it helps somebody. If the actual function is outside httpdocs then it can not be found because the server will be setup to not allow it. Only tested it one folder deep too but the recursive methodology should work in theory.
This is like version 0.1 but I don't intend on continuing development on it so if someone updates it feel free to repost it.
참고URL : https://stackoverflow.com/questions/2960805/php-determine-where-function-was-called-from
'code' 카테고리의 다른 글
orderBy 후 Angularjs가 잘못된 $ index (0) | 2020.09.05 |
---|---|
std :: string 비교 (문자열이 다른 문자열로 시작하는지 확인) (0) | 2020.09.05 |
VS 2010에서 들여 쓰기 점선을 비활성화하는 방법 (0) | 2020.09.05 |
단일 명령문에서 Java에서 실행되는 여러 쿼리 (0) | 2020.09.05 |
코드 축소 방법-dex의 65k 메서드 제한 (0) | 2020.09.05 |