Mit XDebug einer PHP-Web-Service-Seite zu verfolgen
Frage
Ich bin mit Eclipse und XDebug eine PHP-Anwendung zu entwickeln, die auf Web-Services setzt. Ich habe Testseiten, die meine Dienste auf 2 Arten konsumieren. AJAX (mit jQuery) und cURL
ich hinzufügen einzelnen Stützpunkten meine Service-Seite und den Debugger starten. Als ich das den Dienst von AJAX aufrufen, Ausführung schön an den Haltepunkt stoppt, und ich meine Variablen zu erhalten, Schritt-für-Schritt-Steuerung usw.
Aber wenn ich den Dienst mit cURL nennen (das heißt innerhalb einer PHP-Seite), nicht die einzelnen Stützpunkte Funktion. Auch wenn ich auf der „Break at ersten Zeile“ Debugger-Option aktivieren, kann ich nicht die Ausführung zu stoppen erhalten, wenn cURL.
Ist es ein Debugger Verhalten? Benötige ich einen hearder meiner cURL Anrufe hinzufügen? Ändern Sie die URL? Oder ist es eine XDebug Einschränkung?
Vielen Dank für Ihre Zeit und Mühe, Guy
Lösung
Ich kann noch nicht kommentieren, so dass ich dies als eine Antwort schreiben.
Können Sie debuggen mehr als eine AJAX-Anforderung in einer Sitzung? Wurde Ihr Debug-Sitzung noch in Eclipse ausgeführt wird, wenn Sie debuggen mit cURL versucht?
Beschreibung, wie es funktioniert für mich:
- Starten Sie Debug-Sitzung mit einer einfachen debug.php-Datei, die sonst nur ein
<?php
und nichts enthält. Es stoppt in der ersten Zeile, Sie auf „Weiter“, und es beendet die Ausführung. - fordern Sie nun das Skript mit cURL (oder einen anderen Browser) hinzufügen? XDEBUG_SESSION_START = ECLIPSE_DBGP auf seinem Weg (ich glaube, auch diese zusätzlich optional)
- Ihr Skript sollte in der Debug-Ansicht angehalten in der ersten Zeile angezeigt
Hope ths hilft.
Andere Tipps
Hier ist Tipp, wie Xdebugger Client von Locke ohne Browser auslösen:
1- Von Befehlszeile:
curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php
2- Von 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);
?>
So spielt es keine Rolle, ob Sie anhängen „XDEBUG_SESSION = 1“ zu kräuseln URL, aber was notwendig ist, ist eine richtige Cookie zu senden, zusammen mit Anfrage.
Ich weiß, dass dies ein ziemlich alten Thread, aber ich dachte, dass ich für die anderen meine Erfahrungen schreiben würde, die sich über sie kommen, wie ich mit dem gleichen Problem tat. Was ich entdeckte, ist, dass, wenn Sie debuggen remote (was ich immer tun), es gibt ein paar Einstellungen, die Sie ändern diese Arbeit machen in der php.ini haben. Hier sind diejenigen, die für mich gearbeitet:
xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}
Die erste Einstellung ist in der Regel „wahr“ und erzählt xdebug zu sehen für die Kunden mit der gleichen IP-Adresse, an der HTTP-Anforderung stammte. In diesem Fall jedoch kommt die Anforderung von dem Server, so dass wird nicht funktionieren. Stattdessen müssen Sie die zweite Einstellung verwenden xdebug zu sagen, wo das Client zu finden. Hoffe, das hilft ein wenig Zeit sparen jemand!
Der Debugger die einfachste Lösung auszulösen ist die Cookie-Ansatz -b XDEBUG_SESSION=ECLIPSE_DBGP
für mich auf Eclipse gearbeitet zu verwenden, finden Sie unter:
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
Wenn Sie den Ajax-Request debuggen, ist, dass man durch den Browser geschickt in dem gleichen Navigation Kontext wie die andere (Nicht-Ajax) Anfragen -., Weshalb es gut funktioniert
Der Antrag wird von Locke in einem anderen, unterschiedlichen, kontext geschickt - und ich bin nicht sicher, können Sie den Debugger in die Haken ... Aber vielleicht ...
Zunächst einmal ist hier eine Information, die hilfreich sein könnten, unter Angabe der Xdebug Dokumentation :
enthält Xdebug Funktionalität zu halten Spur einer Sitzung debuggen, wenn gestartet Über einen Browser: Cookies. Das funktioniert wie folgt aus:
- Wenn die URL-Variable
XDEBUG_SESSION_START=name
ist Um eine URL sendet einen Xdebug hängten Cookie mit dem Namen „XDEBUG_SESSION
“ und als Wert der Wert desXDEBUG_SESSION_START
URL-Parameter.- Wenn es ein GET (oder POST) Variable
verbindenXDEBUG_SESSION_START
oder dieXDEBUG_SESSION
Cookie gesetzt, Xdebug wird versuchen, zu einem debugclient.- Um eine Debug-Sitzung zu beenden (und das Cookie zu zerstören) einfach die URL hinzufügen Parameter
XDEBUG_SESSION_STOP
. Xdebug wird dann versuchen, nicht mehr zu machen eine Verbindung zum debugclient.
Vielleicht könnte es funktionieren, wenn Sie das Cookie „von Hand“ gesetzt, sendet es allong die Locke Anfrage ...
Ich nehme an, Sie würden zuerst seinen Wert erhalten müssen, als Satz von Xdebug zu Beginn der Debug-Sitzung -. Wiederverwendung des Cookies in Ihrem Browser haben sollte möglich sein, obwohl
Hinweis:? Ich habe dies nie versucht - wenn Sie versuchen, und es funktioniert, könnten Sie bitte bestätigen, es funktionierte
Ich lief in das gleiche genaue Problem. Ich löste es durch die Auto-Start-Funktion drehen off in der php.ini:
xdebug.remote_autostart = 0
und dann den API-Schlüssel an die Webservice-URL, dass meine WebService Client-Aufrufe:
?XDEBUG_SESSION_START=<your API key here>
, und ich bin nicht sicher, ob diese Dinge, aber ich trat in dem API-Schlüssel in meinen Debugger (MacGDBp). Nun feuert der Debugger nur auf, wenn der webervice serverseitiges Skript aufgerufen wird, nicht, wenn der Client gestartet wird.
Hope, das hilft.