무엇이 온라인 디버깅입니까?온라인 생산환경에서 디버깅을 하는 것입니다. 사용자가 어느 날 어떤 페이지의 어떤 데이터를 보고 왜 잘못된가 봅니다. 보아하니 온라인상에서 BUG가 나오는지 빨리 원인을 찾아야 합니다. 먼저 로그를 보면 비극적으로 BUG의 원인을 알 수 없습니다. 아마도 당신은 지금 어떤 PHP 변수의 값을 보고 싶을지도 모릅니다. 하지만 만약 직접 온라인에 코드를 디버깅하면 매우 위험합니다. 오프라인 환경을 사용한다면, 데이터 환경이 다르면 온라인상의 BUG를 재현하기 어려울 수 있습니다. 이 php 온라인 디버깅 도구는 이러한 문제를 해결하기 위해 발생하며, 당신은 임의의 온라인 PHP 변수의 값을 쉽게 볼 수 있습니다.그것은 또한 많은 기타 기능이 있다.모든 기능은 본문 목록을 참고한다.
ydb는 url에 관련 디버깅 파라미터를 입력하면 클래스명, 함수명, 변수명 등 관련 변수 값을 볼 수 있도록 확장 구현했다.ydb를 사용하면 임의의 변수 값을 볼 수 있을 뿐만 아니라 함수 실행 시간이 얼마나 걸리는지 볼 수 있습니다. 즉, 업무 로직 BUG를 배제할 뿐만 아니라 성능 문제도 볼 수 있습니다.확장이 성능에 미치는 영향은 미미할 수 있습니다. 추가 계산은 디버거가 직접 요청한 결과입니다. 만약 당신이 작은 성능 영향도 용납할 수 없다고 생각한다면, 디버깅할 때 이 확장을 추가하여 php 프로세스를 재시작하면 됩니다.
ydb의 구체적인 사용법을 알아보자.
다음과 같은 코드가 index.php에 우리의 디버깅 대상이라고 가정하자.
<?php
class CB {
private $pv = 'abc';
function add($a,$b){
return $a+$b;
}
}
class CA {
public function look_value($pa,$pb){
$fa = $pa;
$fb = $pb;
$fc = $fa+$fb;
$arr = array(1,2,3);
$objCb = new CB();
$fd = $objCb->add(3,4);
$arr = array(4,5,6);
return $fd;
}
function look_cost(){
$this->fun1();
$this->fun2();
$this->fun3();
usleep(300000);
}
function fun1(){
usleep(100000);
return;
}
function fun2(){
usleep(200000);
return;
}
function fun3(){
usleep(500000);
return;
}
}
$objAt = new CA();
$res = $objAt->look_value(1, 2);
$res = $objAt->look_cost();
echo "should not be here";
1. 변수 값 보기
C클래스를 봐야 한다고 가정해보자.A 함수 look_value의 변수 arr 값
우리는 브라우저에 있어야 한다.다음 URL을 입력하십시오: http://php.wenda.so.com/index.php?c=CA&f=look_value&v=arr,
각 파라미터의 의미는 다음과 같다.
c: 클래스 이름 표시
f: 함수 이름 표시
v: 보고 싶음을 나타냅니다.의 변수 이름
url을 입력한 결과는 다음과 같습니다.
결과적으로 값은 arr의 두 번째 값이기 때문에 ydb의 표시값은 모두 함수 실행이 끝난 변수의 마지막 값(무엇?)이다.중간값을 보고 싶으면 나중에 있을 것이다.)
또한, v 파라미터를 입력하지 않으면 함수의 모든 변수를 출력하여 http://php.wenda.so.com/inde를 입력한다.x.php?c=CA&f=look_value의 결과는 다음과 같다.
함수 look_value의 모든 변수를 볼 수 있으며 인자와 객체의 값을 출력합니다
get 요청인데 post 요청이라면 어떻게 해야 하나요?또한, url에 인자를 입력하여 제출 양식을 열어서 제출 시 해당 변수 값을 인쇄할 수 있습니다. 단, 인수 o는 post 양식 요청임을 나타내므로 현재 요청에서 인자가 수행되지 않습니다.URL 열기: http://php.wenda.so.com/post.html?c=CA&f=look_value&o=1, 폼 표시:
제출 버튼을 누른 후, 아래와 같이 클래스 함수 look_value의 값을 출력합니다. get 요청과 동일합니다
확장 중 즉, post에서 요구한 refer 값을 읽음으로써 변수 값 인쇄를 가능하게 한다.
때때로 웹 브라우저에 관련 값을 표시하고 싶지 않을 수 있습니다.예를 들어, 로그 파일에 인쇄하고 싶을 때, url에 l=1 매개 변수를 추가하면 해당 변수를 로그 파일에 출력할 수 있습니다. 로그 파일은 log/ydbinfo.log, php 설치 루트 디렉터리에 있습니다.
2. 실행 시간 보기
ydb는 어떤 함수의 실행 하위 함수의 높낮이를 볼 수 있다실행 시간 순위와 이 함수 실행의 총 소요 시간을 함수별로 추적하면 시스템의 병목현상이 어디에 있는지, 어떤 함수 실행이 가장 오래 걸리는지를 쉽게 찾을 수 있다.
실행 시간을 보려면 c,f 인수도 입력해야 하는데, 어느 것을 보는지 표시해야 합니다.클래스의 어떤 함수에 시간이 걸리는지, t=1 인수를 더하면 변수 값을 보는 것이 아니라 보는 데 시간이 걸린다는 것을 나타냅니다.이전 index.php의 코드를 계속 사용하고 url: http://php.wenda.so.com/index.php?라고 입력하십시오.c=CA&f=look_cost&t=1,바로 아래와 같은 결과를 볼 수 있다
맨 위 행은 look_cost의 총 소요 시간을 나타내고, 다음 look_cost에서 호출된 세 가지 함수의 소요 시간을 나타내는 순서입니다. 실제 상황에서 우리는 f 매개 변수를 시간이 가장 많이 걸리는 하위 함수로 변경하여 단계별로 추적하여 시스템의 병목 지점을 찾을 수 있습니다.
post 요청과 로그 출력은 변수 값을 보는 것과 마찬가지로 o,l 파라미터를 이용하면 된다.
3. 런타임 변수 값 변경 - 강력한 장치 테스트 도구
때때로 우리는 어떤 사용자가 보여주는 개인 데이터가 잘못되고 개발자는 사용자 계정에 로그인하여 볼 수 없는 상황에 직면할 수 있습니다. 우리는 사용자가 보여주는 데이터가 무엇인지 알고 있어야 합니다.ydb에서 런타임 변수 값을 변경할 수 있습니다.관련 함수의 파라미터를 해당 사용자의 개인 데이터로 바꾸면 그의 개인 데이터를 볼 수 있다.
index.php를 다음과 같이 수정합니다.
<?php
class CB {
private $pv = 'abc';
function add($a,$b){
return $a+$b;
}
}
class CA {
public function look_value($pa,$pb,$arr){
$pa = 8;
$fa = $pa;
$fb = $pb;
$fc = $fa+$fb;
$arr = array(1,2,3);
$objCb = new CB();
$fd = $objCb->add(3,4);
$arr = array(4,5,6);
return $fd;
}
function look_cost(){
$this->fun1();
$this->fun2();
$this->fun3();
usleep(300000);
}
function fun1(){
usleep(100000);
return;
}
function fun2(){
usleep(200000);
return;
}
function fun3(){
usleep(500000);
return;
}
}
$objAt = new CA();
$arr = array('aa' => 'vvv' ,'bb' =>123);
$res = $objAt->look_value(1, 2,$arr);
$res = $objAt->look_cost();
echo "should not be here";
새로운 변수 값은 a라는 url 파라미터에 입력되며, 다음과 같이 파라미터 http://php.wenda.so.com/index.php?c=CA&f=look_value&a={pa=3:pb=4}를 입력하면 다음과 같은 결과를 볼 수 있습니다
"the replace variable list" 는 해당 변수 치환 전후의 값을 나타내고, url 에서 a = {pa = 3:pb = 4} 는 pa 를 나타내며, pb 는 새로운 변수 값으로 코드에서 원래 들어오는 값을 덮어쓸 수 있으며, 우리는 임의의 여러 값을 입력할 수 있지만, 덮어쓴 변수가 있어야 유효하며, 함수에 재할당되는 변수가 있을 경우 새로운 값을 사용합니다. pa 값이 8이고 pb 는 새로운 값이 4가 됩니다.각 파라미터는 콜론으로 구분한다.덮어쓰기 코드의 변수 값도 당연히 어떤 클래스의 어떤 함수에 대한 것이어야 하기 때문에 c,f 인수가 적지는 않을 것이다.
때로는 우리 함수의 어떤 변수가 배열일 때도 있고, ydb도 마찬가지로 배열의 변수 값을 덮어쓸 수 있다.아래와 같이 url http://php.wenda.so.com/index.php?c=CA&f=look_value&a={pa=3:pb=4:arr[abc]=123} 다음과 같이 표시됩니다
실제로 우리는 어떤 형태로든 pa와 같은 배열이 아닌 변수를 pa로, 반대로 원래 배열이었던 변수를 일반 비배열 변수로 덮어씌워 원하는 임의의 복잡하고 다층적인 배열을 만들 수 있다.
일반적으로 우리는 함수의 입력 파라미터만 덮어쓰면 되기 때문에 함수에 대한 셀 테스트를 쉽게 할 수 있다.항상 우리는 어떤 함수의 작은 코드 한 단락만 바꾸면 된다. 즉, 그것의 정확성만 검증하면 된다. 우리는 ydb를 사용하여 여러 가지 파라미터 조합을 덮어쓸 수 있다.셀 테스트를 하면 브라우저 페이지 조작 중에 다양한 특수 입력 파라미터를 구성하기 어려울 수 있으므로, 파라미터를 사용자 정의할 수 있어 편리합니다.
또한 이러한 변수 덮어쓰기 기능을 바탕으로 테스트 데이터를 모두 url의 a-파라미터로 입력하는 강력한 셀 테스트 프레임워크를 구축할 수 있다.이 유닛 테스트 프레임워크는 언어와 무관합니다. 테스트 대상과 HTTP 프로토콜을 통해 상호 작용하기 때문에 이를 사용할 수 있습니다.언어 쓰기 유닛 테스트 클라이언트에서 PHP 코드에 대한 유닛 테스트를 수행한다.마찬가지로, 우리는 ydb와 같은 HTTP 프로토콜을 지원하는 인터랙티브 방식이라면 클라이언트들을 통해 여러 언어의 항목을 테스트할 수 있다.
4. 네트워크를 넘나드는 디버깅 도구
현재 대형 웹사이트 내부는 일반적으로 기능에 따라 여러 모듈(또는 하위 시스템)로 나뉘며, 일부 하위 모듈은 종종 하나의 서비스로 HTTP 인터페이스를 제공한다. 각 모듈은 서로 다른 기계 클러스터에 배치될 수 있으며 HTTP 프로토콜을 통해 상호 작용할 수 있다. 이것은 전형적인 SOA 아키텍처이다.
ydb는 네트워크 간 디버깅을 지원한다. 만약 우리의 브라우저 요청이 먼저 A모듈에 도착했다면, A모듈은 HTTP 프로토콜을 통해 B모듈을 호출했다면, 앞서 설명한 모든 디버깅 기능을 B모듈에서 사용할 수 있다.우리는 url에 B모듈의 클래스명을 입력할 수 있으며, 함수명은 바로 알아볼 수 있습니다.기타 변수 값 또는 시간 소모 순위.물론 B모듈이 C모듈을 다시 호출했다고 가정하면 우리는 마찬가지로 C모듈을 디버깅할 수 있다. 해당 모듈이 ydb 확장을 장착하면 ydb는 현재 HTTP 프로토콜의 네트워크 호출만 지원한다.
다음과 같은 클라이언트 코드 rpccclient.php가 있다고 가정하면, 서비스 쪽 코드는 이전 index.php입니다
<?php
$url = "http://127.0.0.1/index.php";
$host="php.wenda.so.com";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('host:'.$host));
$res = curl_exec($ch);
//print_r($res);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('host:'.$host));
$res = curl_exec($ch);
//print_r($res);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('host:'.$host));
$res = curl_exec($ch);
브라우저에 url php.wenda.so.com/rpcclient.php?c=CA&f=look_value&v=arr을 입력하세요. 결과는 다음과 같습니다
서비스측 코드에서 반환된 해당 변수 값을 보면 디버깅에서 직접 호출한 모듈과 동일한 효과를 볼 수 있으므로 일부 백엔드 모듈 유지 관리자에게 편리합니다.
5.네트워크 호출 성능 분석
앞서 기술한 바와 같이 시간 소모 순위 확인 기능은 어떤 함수 내에서 실행되는 것에 대한 것이지만, 일반적으로 우리는 어떤 모듈이 외부 인터페이스를 통해 호출하는 데 시간이 걸리는 것에 대해 더 많은 관심을 가지고 있으며, ydb는모듈 안에 있는 요청외부 네트워크 요청은 시간이 많이 걸리고 정렬되며, 동일한 url 요청은 파라미터에 r 파라미터를 입력하면 된다.
브라우저에 url php.wenda.so.com/rpcclient.php을 입력하시겠습니까?r=1은 다음과 같이 표시됩니다.
이러한 기능을 통해 우리는 어떤 외부 인터페이스 호출이 가장 오래 걸렸는지 금방 알 수 있다. 현재 ydb는 HTTP 프로토콜 인터페이스 호출에 대한 시간 소모만을 지원하고 있으며, 미래에는 mysql, redis, memcache 등 일반적으로 사용되는 다른 네트워크 호출에 대한 지원을 고려하고 있다.
6.dump 코드 페이지 간
url에 s 파라미터를 더해 해당 함수의 코드 dump를 페이지에 띄워 변수 값을 분석할 때 다른 곳에 가지 않아도 되는 작은 기능이다.브라우저에 다음과 같이 url을 입력하십시오
http://php.wenda.so.com/index.php?c=CA&f=look_value&s=1 결과를 다음과 같이 표시합니다
gdb와 비슷한지 변수 값을 볼 때도 코드를 읽을 수 있다.ydb는 gdb보다 더 많은 강력한 기능을 계획하고 있다.
이 확장은 github에 이미 https://github.com/micweaver/ydb에 있으며, ydb는 php5.2 이상을 지원하며, Makefile의 php 소스 경로를 자신의 디렉토리 실제 경로로 변경하여 yd를 컴파일할 수 있습니다.b.so파일을 하시면 되고 php.ini파일에 아래와 같은 구성을 추가하시면 php 프로세스를 다시 시작하면 풀업을 사용할 수 있습니다.
zend_extension= "ydb.so 파일의 경로"
확장 so 파일을 컴파일하기 위한 구체적인 절차는 다음과 같습니다. 현재 리눅스 환경에서만 사용할 수 있습니다. 컴파일된 확장 파일을 바로 다운로드할 수 있습니다.
http://download.csdn.net/detail/micweaver/6823323 php5.3 이상 버전 적용
http://download.csdn.net/detail/micweaver/6823361 php5.2 버전 적용
'개발 꿀팁 > PHP' 카테고리의 다른 글
PHP의 __call() (0) | 2022.07.07 |
---|---|
이 글을 읽고 나면 당신의 PHP코드는 우아하고 격조높습니다 (0) | 2022.07.07 |
PHP 빅데이터(50만 이상) 엑셀 솔루션으로 내보내기 (0) | 2022.07.07 |
centos8-분리형 lamp 아키텍처 (0) | 2022.07.07 |
/etc/init.d/php-fpm no such file or directory 문제 해결 (0) | 2022.07.06 |