문제

Eclipse 및 Xdebug를 사용하여 웹 서비스에 의존하는 PHP 응용 프로그램을 개발하고 있습니다. Ajax (jQuery 사용)와 Curl의 두 가지 방법으로 서비스를 소비하는 테스트 페이지가 있습니다.

서비스 페이지에 중단 점을 추가하고 디버거를 시작합니다. Ajax에서 서비스를 호출 할 때, 실행은 중단 점에서 멋지게 중지되고, 내 변수, 단계별 제어 등을 얻습니다.

그러나 Curl을 사용하여 서비스를 호출 할 때 (즉, PHP 페이지 내에서) 중단 점이 작동하지 않습니다. "First Line에서 Break"Debugger 옵션을 켜더라도 CURL을 사용할 때 실행을 중지 할 수 없습니다.

디버거 동작입니까? 컬 통화에 허더를 추가해야합니까? URL 변경? 아니면 XDEBUG 제한입니까?

시간과 노력에 감사드립니다

도움이 되었습니까?

해결책

아직 언급 할 수 없으므로 답변으로 게시합니다.

한 세션에서 하나 이상의 AJAX 요청을 디버깅 할 수 있습니까? CURL을 사용하여 디버그를 시도 할 때 디버그 세션이 Eclipse에서 여전히 실행 되었습니까?

그것이 어떻게 작동하는지에 대한 설명 :

  1. 단순한 debug.php 파일 만 포함하여 디버그 세션을 시작합니다. <?php 그리고 다른 것은 없습니다. 첫 번째 줄에서 멈추고 "계속"하고 실행이 완료됩니다.
  2. 이제 Curl (또는 다른 브라우저)을 사용하여 스크립트를 요청하십시오. xdebug_session_start = eclipse_dbgp는 경로에 추가하십시오 (이 추가는 선택 사항이라고 생각합니다).
  3. 스크립트가 첫 번째 줄에서 정지 된 디버그보기에 스크립트가 나타납니다.

희망이 도움이되기를 바랍니다.

다른 팁

다음은 브라우저가없는 Curl에서 Xdebugger 클라이언트를 트리거하는 방법에 대한 팁입니다.

1- 명령 줄 :

curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php

2- PHP에서

<?php 
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL, 'http://YOUR-SITE.com/your-script.php');
curl_setopt ($ch, CURLOPT_COOKIE, 'XDEBUG_SESSION=1');
curl_exec ($ch);
?>

따라서 "xdebug_session = 1"을 URL에 첨부하는 것은 중요하지 않지만, 필요한 것은 요청과 함께 적절한 쿠키를 보내는 것입니다.

나는 이것이 꽤 오래된 실이라는 것을 알고 있지만, 같은 문제로 내가했던 것처럼 다른 사람들을 위해 내 경험을 게시 할 것이라고 생각했습니다. 내가 발견 한 것은 원격으로 디버깅하는 경우 (항상해야 할 일) Php.ini 에서이 작업을 수행하기 위해 변경 해야하는 몇 가지 설정이 있다는 것입니다. 다음은 저를 위해 일한 것입니다.

xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}

첫 번째 설정은 일반적으로 "true"이며 Xdebug에게 HTTP 요청이 시작된 동일한 IP 주소에서 클라이언트를 찾도록 지시합니다. 그러나이 경우 요청이 서버에서 나오므로 작동하지 않습니다. 대신 두 번째 설정을 사용하여 XDEBUG에 클라이언트를 찾을 위치를 알려야합니다. 이것이 누군가를 조금 절약하는 데 도움이되기를 바랍니다!

디버거를 트리거하려면 가장 간단한 솔루션은 쿠키 접근법을 사용하는 것입니다. -b XDEBUG_SESSION=ECLIPSE_DBGP Eclipse에서 저를 위해 일했습니다. 아래를 참조하십시오.

curl  -H 'Content-type: application/json' \
      -b XDEBUG_SESSION="ECLIPSE_DBGP" \
      -X POST \
      -d '{"uid":200, "message":"asdsad","message_type":1}' 
      http://daxuebao.local:8083/api/message/send

AJAX 요청을 디버깅 할 때, 하나는 브라우저에서 전송됩니다. (비-삭스) 요청 - 이것이 잘 작동하는 이유입니다.


Curl이 보낸 요청은 다른 컨텍스트에 있습니다. 그리고 디버거를 그것에 연결할 수 있는지 확실하지 않습니다 ... 그러나 아마도...

우선, 여기에 도움이 될 수있는 정보가 있습니다. Xdebug의 문서 :

Xdebug에는 브라우저를 통해 시작될 때 디버그 세션을 추적하는 기능이 포함되어 있습니다 : 쿠키. 이것은 다음과 같이 작동합니다.

  • URL 변수 일 때 XDEBUG_SESSION_START=name URL에 추가 xdebug가 이름으로 쿠키를 방출합니다. "XDEBUG_SESSION"그리고 가치로서 XDEBUG_SESSION_STARTURL 매개 변수.
  • get (또는 post) 변수가있을 때 XDEBUG_SESSION_START 아니면 그 XDEBUG_SESSION 쿠키가 설정되며 Xdebug는 디버그 클라이언트에 연결하려고합니다.
  • 디버그 세션을 중지하고 쿠키를 파괴하려면 URL 매개 변수를 추가하십시오. XDEBUG_SESSION_STOP. 그런 다음 Xdebug는 더 이상 디버그 클라이언트와 연결하려고하지 않습니다.

어쩌면 쿠키를 "손으로"설정하면 컬 요청을 전송하면 작동 할 수도 있습니다.

디버깅 세션이 시작될 때 Xdebug가 설정 한대로 먼저 그 가치를 얻어야한다고 생각합니다.하지만 브라우저에있는 쿠키를 재사용 할 수 있습니다.

참고 : 나는 이것을 시도한 적이 없다 - 당신이 시도하고 그것이 효과가 있다면, 그것이 효과가 있는지 확인해 주시겠습니까?

나는이 똑같은 정확한 문제에 부딪쳤다. 자동 시작 기능을 돌려 해결했습니다 끄다 php.ini에서 :

xdebug.remote_autostart = 0

그런 다음 내 웹 서비스 클라이언트가 호출하는 WebService URL에 API 키를 추가합니다.

?XDEBUG_SESSION_START=<your API key here>

그리고 이것이 중요한지 확실하지 않지만 Debugger (MACGDBP)에 API 키를 입력했습니다. 이제 디버거는 클라이언트가 시작될 때가 아니라 Webervice 서버 측 스크립트가 호출 될 때만 발생합니다.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top