PHP - 함수가 호출된 시기를 인식합니다.
-
20-09-2019 - |
문제
함수가 호출된 위치를 찾는 방법을 생각 중입니다.문제는 PHP가 호출하는 위치를 찾아야 한다는 것입니다. mail()
기능.한 가지 방법은 다음과 같습니다. register_tick_function()
, 하지만 각 파일을 열고 각 줄에 무엇이 있는지 확인해야 합니다.프로젝트 규모가 커서 PHP에서 각 파일을 구문 분석하는 데 정말 오랜 시간이 걸립니다.다른 방법은 없나요?또는 옵션을 재정의하는 방법 mail()
기능?
해결책
내장 메일 기능을 무시하려면 살펴보십시오. 재정의 _function 어느 것입니다 고급 PHP 디버거 PECL 확장 - 그런 다음 사용할 수 있습니다 debug_backtrace 발신자 세부 정보를 찾으려면 ...
//define code to override mail function (note I've used php5.3 nowdoc syntax to avoid
//the need to escape the dollar symbols!!
$code=<<<'CODE'
$trace=debug_backtrace();
$caller=array_shift($trace);
echo 'mail() called by '.$caller['function']
if (isset($caller['class']))
echo 'in '.$caller['class'];
CODE;
//install override
override_function('mail', '$to,$subject,$msg,$hdrs,$params', $code);
다른 팁
다음을 사용하여 스택 추적을 검사할 수 있습니다. debug_backtrace()
.여기에는 호출 메서드/함수에 대한 정보가 포함됩니다.예제는 설명서를 참조하세요.
기존 함수에 동작을 추가하려면 함수를 자체 함수나 클래스로 래핑한 다음 기본 함수 대신 이를 호출하세요.
기본 기능을 완전히 재정의하려면 다음을 설치해야 합니다. runkit
.그러면 당신은 할 수 있습니다 runkit_redefine_function()
(또는 다른 곳에서 제안된 대로 APD를 사용하십시오).
프로젝트의 어디에 있는지 알고 싶다면 mail()
예를 들어 다음과 같이 호출되었습니다.런타임 시 이를 평가할 필요가 없으며 IDE의 검색 기능을 사용하십시오.Eclipse, Zend Studio 및 Netbeans는 파일 검색을 수행할 수 있으므로 호출을 찾고 교체하는 것이 매우 쉽습니다.
Brute Force 접근 방식은 글로벌 검색을 수행하고 코드를 교체하여 "Mail S ("My_mail ( "로)을 대체 한 다음 My_mail을 정의하고 원하는 로깅 기능을 배치하는 것입니다.
"Mail (") 소스를 단순히 검색하지 않는 이유는 무엇입니까?
소스 코드에 액세스 할 수 있습니까?
왜 Jedit과 같은 편집기를 사용하고 모든 우편물이 발생하는지 (* 모든 오픈 버퍼에서?
아니면 실제로 런타임에 라인 번호를 알아야합니까? 나는 당신이 실제로 그렇게한다고 상상할 수 없습니다.