En utilisant XDebug pour tracer une page de service Web PHP
Question
J'utilise Eclipse et XDebug pour développer une application PHP qui repose sur les services Web. J'ai des pages de test qui consomment mes services de 2 façons:. AJAX (en utilisant jQuery) et cURL
ajouter des points d'arrêt sur ma page de service et lancer le débogueur. Quand j'appelle le service d'AJAX, l'exécution s'arrête bien au point d'arrêt, et je reçois mes variables, contrôle étape par étape, etc.
Mais quand je l'appelle le service à l'aide cURL (à savoir à partir d'une page PHP), les points d'arrêt ne fonctionnent pas. Même si je tourne sur le « Break à première ligne » option de débogage, je ne peux pas obtenir l'exécution d'arrêter lorsque vous utilisez cURL.
Est-ce un comportement de débogage? Ai-je besoin d'ajouter un Hearder à mes appels cURL? Modifier l'URL? Ou est-ce une limitation xdebug?
Merci pour votre temps et d'efforts, Guy
La solution
Je ne peux pas commenter, donc je poster cela comme une réponse.
Pouvez-vous déboguer plus d'une requête AJAX en une seule session? Est-ce votre session de débogage en cours d'exécution encore dans Eclipse lorsque vous avez essayé de débogage en utilisant cURL?
Description de la façon dont il fonctionne pour moi:
- Lancer session de débogage avec un simple fichier debug.php qui ne contient qu'une
<?php
et rien d'autre. Il arrête sur la première ligne, vous « continuer » et il termine l'exécution. - demandez maintenant le script en utilisant cURL (ou un autre navigateur) en ajoutant? XDEBUG_SESSION_START = ECLIPSE_DBGP son chemin (je pense même cet ajout est facultatif)
- Votre script devrait apparaître dans la vue de débogage arrêté à la première ligne
Espoir ths aide.
Autres conseils
Voici conseil sur la façon de déclencher le client Xdebugger de Curl sans navigateur:
1- De la ligne de commande:
curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php
2- De 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);
?>
Il n'a pas d'importance si vous attachez « XDEBUG_SESSION = 1 » à CURL URL, mais ce qui est nécessaire est d'envoyer un cookie approprié avec demande.
Je sais que c'est un fil assez vieux, mais je pensais que je poste mon expérience pour d'autres qui peuvent venir à travers elle, comme je l'ai fait, avec le même problème. Ce que j'ai découvert est que, si vous êtes le débogage à distance (ce que je fais toujours), il y a des paramètres de couple que vous devez changer dans php.ini pour faire ce travail. Voici ceux qui ont travaillé pour moi:
xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}
Le premier paramètre est normalement « vrai » et dit xdebug de chercher le client à la même adresse IP à laquelle la requête HTTP origine. Dans ce cas cependant, la demande provient du serveur, de sorte que ne fonctionnera pas. Au lieu de cela, vous devez utiliser le second paramètre pour indiquer à xdebug où trouver le client. Espérons que cela aide à sauver quelqu'un un peu de temps!
Pour déclencher le débogueur la solution la plus simple est d'utiliser l'approche cookie -b XDEBUG_SESSION=ECLIPSE_DBGP
travaillé pour moi sur Eclipse, voir ci-dessous:
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
Lorsque vous déboguez la requête Ajax, que l'on est envoyé par le navigateur, dans le même contexte de navigation que les autres (non-Ajax) demandes - ce qui explique pourquoi il fonctionne très bien <. / p>
La demande envoyée par boucle est dans un autre, différent, contexte - et je ne suis pas sûr que vous pouvez brancher le débogueur dans cette ... Mais, peut-être ...
Tout d'abord, voici une information qui pourrait se révéler utile, citant la documentation de la Xdebug :
Xdebug contient des fonctionnalités de garder piste d'une session de débogage au démarrage via un navigateur: cookies. Cela marche comme ceci:
- Lorsque la variable URL est
XDEBUG_SESSION_START=name
jointe à une URL Xdebug émet un cookie avec le nom «XDEBUG_SESSION
» et de la valeur en tant que La valeur de laXDEBUG_SESSION_START
paramètre d'URL.- Quand il y a une
XDEBUG_SESSION_START
des variables GET (ou POST) ou cookieXDEBUG_SESSION
est défini, Xdebug tente de se connecter à un DebugClient.- Pour arrêter une session de débogage (et de détruire le cookie) il suffit d'ajouter l'URL paramètre
XDEBUG_SESSION_STOP
. Xdebug ne sera alors plus essayer de faire une connexion au DebugClient.
Peut-être que cela pourrait fonctionner si vous définissez ce cookie « à la main », l'envoyer allong la demande boucle ...
Je suppose que vous auriez d'abord obtenir sa valeur, fixée par Xdebug au début de la session de débogage -. Réutiliser le cookie que vous avez dans votre navigateur devrait être possible, bien que
Note: Je ne l'ai jamais essayé cela - si vous essayez, et il fonctionne, pourriez-vous s'il vous plaît confirmer travaillé
?Je suis tombé sur cette même question exacte. Je l'ai résolu en tournant la fonction de démarrage automatique off dans le fichier php.ini:
xdebug.remote_autostart = 0
, puis en ajoutant la clé API à l'URL de webservice que mon client appelle webservice:
?XDEBUG_SESSION_START=<your API key here>
et je ne sais pas si cette question est importante, mais je suis entré dans la clé API dans mon débogueur (MacGDBp). Maintenant, le débogueur se déclenche uniquement lorsque le script côté serveur webervice est appelé, pas lorsque le client est démarré.
Hope this helps.