Ich verwende Eclipse und XDebug, um eine PHP-Anwendung zu entwickeln, die auf Web-Services basiert. Ich habe Testseiten, die meine Dienste auf zwei Arten nutzen: AJAX (mit jQuery) und cURL.
Ich füge Breakpoints zu meiner Service-Seite hinzu und starte den Debugger. Wenn ich den Dienst von AJAX aus anrufe, stoppt die Ausführung am Haltepunkt, und ich bekomme meine Variablen, Schritt-für-Schritt-Steuerung usw.
Aber wenn ich den Service mit cURL (d. h. innerhalb einer PHP-Seite) anrufe, funktionieren die Breakpoints nicht. Selbst wenn ich die Debugger-Option "Break at First Line" aktiviere, kann die Ausführung nicht gestoppt werden, wenn cURL verwendet wird.
Ist es ein Debugger-Verhalten? Muss ich meinen cURL-Anrufen ein Headset hinzufügen? Ändern Sie die URL? Oder ist es eine XDebug-Einschränkung?
Danke für Ihre Zeit und Mühe, Guy
Ich kann noch nichts sagen, also poste ich das als Antwort.
Können Sie mehr als eine AJAX-Anfrage in einer Sitzung debuggen? Wurde Ihre Debugsitzung in Eclipse noch ausgeführt, als Sie versuchten, mit cURL zu debuggen?
Beschreibung wie es für mich funktioniert:
<?php
und nichts anderes enthält. Es stoppt in der ersten Zeile, Sie "weiter" es und es beendet die Ausführung. Hope ths hilft.
Hier ist ein Tipp, wie Sie den Xdebugger-Client von Curl ohne Browser auslösen können:
1- Von der Befehlszeile:
%Vor%2- Von PHP
%Vor%Es spielt also keine Rolle, ob Sie "XDEBUG_SESSION = 1" an die CURL-URL anhängen, aber es ist notwendig, ein korrektes Cookie zusammen mit der Anfrage zu senden.
Ich weiß, dass das ein ziemlich alter Thread ist, aber ich dachte, ich würde meine Erfahrung für andere posten, die vielleicht auf sie stoßen, wie ich, mit dem gleichen Problem. Was ich entdeckt habe, ist, dass, wenn Sie remote debuggen (was ich immer mache), einige Einstellungen in php.ini geändert werden müssen, damit dies funktioniert. Hier sind die, die für mich funktionierten:
%Vor%Die erste Einstellung ist normalerweise "wahr" und weist xdebug an, nach dem Client an der gleichen IP-Adresse zu suchen, von der die HTTP-Anfrage stammt. In diesem Fall kommt die Anfrage jedoch vom Server, so dass dies nicht funktioniert. Stattdessen müssen Sie die zweite Einstellung verwenden, um xdebug mitzuteilen, wo der Client zu finden ist. Hoffe das hilft jemandem ein wenig Zeit zu sparen!
Wenn Sie die Ajax-Anfrage debuggen, wird diese vom Browser im selben Navigationskontext wie die anderen (nicht Ajax) Anfragen gesendet - weshalb es gut funktioniert.
Die von curl gesendete Anfrage befindet sich in einem anderen, anderen Kontext - und ich bin mir nicht sicher, ob Sie den Debugger in diese Datei einbinden können ... Aber, vielleicht ...
Zunächst finden Sie hier eine Information, die hilfreich sein könnte, wenn Sie die Dokumentation von Xdebug angeben:
Xdebug enthält Funktionalität zum Speichern Track einer Debug-Session beim Start durch einen Browser: Cookies. Das funktioniert so:
- Wenn die URL-Variable
XDEBUG_SESSION_START=name
ist An eine URL angehängt sendet Xdebug a Cookie mit dem Namen "XDEBUG_SESSION
" und als Wert der Wert desXDEBUG_SESSION_START
URL-Parameter.- Wenn eine GET (oder POST) Variable
XDEBUG_SESSION_START
oder dieXDEBUG_SESSION
cookie ist gesetzt, Xdebug wird versuchen, sich mit einem Debugclient zu verbinden.- Um eine Debug-Sitzung zu beenden (und den Cookie zu löschen), fügen Sie einfach die URL hinzu Parameter
XDEBUG_SESSION_STOP
. Xdebug wird dann nicht mehr versuchen zu machen eine Verbindung zum debugclient.
Vielleicht könnte es funktionieren, wenn Sie diesen Cookie "von Hand" setzen und ihn während der Curl-Anfrage senden ...
Ich nehme an, Sie müssten zuerst seinen Wert abrufen, wie er von Xdebug zu Beginn der Debugging-Sitzung festgelegt wurde - die erneute Verwendung des Cookies in Ihrem Browser sollte jedoch möglich sein.
Hinweis: Ich habe das noch nie versucht - wenn Sie es versuchen und es funktioniert, können Sie bitte bestätigen, dass es funktioniert hat?
Ich bin genau auf dieses Problem gestoßen. Ich habe es gelöst, indem ich die Auto-Start-Funktion off in der php.ini:
ausgeschaltet habe %Vor%und dann fügen Sie den API-Schlüssel der Webservice-URL hinzu, die mein Webservice-Client aufruft:
%Vor%und ich bin mir nicht sicher, ob das wichtig ist, aber ich habe den API-Schlüssel in meinen Debugger (MacGDBp) eingegeben. Jetzt wird der Debugger nur gestartet, wenn das serverseitige Skript von webservice aufgerufen wird, nicht wenn der Client gestartet wird.
Hoffe, das hilft.