2010-01-11 5 views
7

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 deux façons: AJAX (en utilisant jQuery) et cURL. Je ajoute des points d'arrêt à ma page de service et lance le débogueur. Quand j'appelle le service d'AJAX, l'exécution s'arrête bien au point d'arrêt, et j'obtiens mes variables, le contrôle pas-à-pas, etc.Utiliser XDebug pour tracer une page de service Web PHP

Mais quand j'appelle le service en utilisant cURL (c'est-à-dire depuis une page PHP) , les points d'arrêt ne fonctionnent pas. Même si j'active l'option de débogage "Pause à la première ligne", je ne parviens pas à arrêter l'exécution lors de l'utilisation de cURL.

Est-ce un comportement de débogueur? Dois-je ajouter un écouteur à mes appels cURL? Modifier l'URL? Ou est-ce une limitation XDebug?

Merci pour votre temps et effort, Guy

Répondre

9

Je ne peux pas encore commenter, donc je poste ceci comme une réponse.

Pouvez-vous déboguer plusieurs requêtes AJAX en une session? Votre session de débogage était toujours en cours d'exécution dans Eclipse lorsque vous avez essayé de déboguer à l'aide de cURL?

Description de la façon dont il fonctionne pour moi:

  1. Démarrer une session de débogage avec un simple fichier debug.php qui ne contient qu'une <?php et rien d'autre. Il s'arrête sur la première ligne, vous "continuez" et il termine l'exécution.
  2. demander 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)
  3. Votre script devrait apparaître dans la vue de débogage arrêté à la première ligne

Espérons que ça aide.

+0

Merci d'essayer Jan. Oui, je peux déboguer plus d'un appel Ajax et Oui, ma session de débogage est toujours en cours dans Eclipse Et comme vous pouvez le voir ci-dessous, J'ai essayé d'ajouter XDEBUG_SESSION_START = ECLIPSE_DBGP à mon appel cURL - en vain –

+0

@Traveling Tech Guy: Je vais essayer cela demain au travail, je suis sûr à 99% que cela fonctionne pour moi, alors nous allons le faire fonctionner pour vous aussi. – janpio

+0

Oui, je l'ai essayé à nouveau et ça marche.Vous n'avez pas besoin de clé, XDEBUG_SESSION_START est suffisant.Il fonctionne dans tous les navigateurs et de toutes les façons que je connecte au serveur ma session debug est en cours. Hecked votre demande de journal si la demande cURL fait vraiment la bonne chose? – janpio

2

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 - - C'est pourquoi ça marche bien.


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 ce ... Mais, peut-être ...

d'abord tous, voici une information qui pourrait se révéler utile, citant le Xdebug's documentation:

Xdebug contient des fonctionnalités pour garder une trace d'une session de débogage lors du démarrage via un navigateur: cookies. Cela fonctionne comme ceci:

  • Lorsque la variable URL XDEBUG_SESSION_START=name est jointe à une URL Xdebug émet un cookie avec le nom « XDEBUG_SESSION » et en tant que valeur la valeur du paramètre d'URL XDEBUG_SESSION_START .
  • Quand il y a un GET (ou POST) variables XDEBUG_SESSION_START ou XDEBUG_SESSION cookie est, Xdebug tente de se connecter à un DebugClient.
  • Pour arrêter une session de débogage (et détruire le cookie), il suffit d'ajouter l'URL paramètre XDEBUG_SESSION_STOP. Xdebug n'essaiera alors plus d'établir une connexion au débogclient avec .

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, tel que par Xdebug au début de la session de débogage - réutiliser le cookie que vous avez dans votre navigateur devrait être possible, cependant.

Note: Je n'ai jamais essayé ceci - si vous essayez, et cela fonctionne, pourriez-vous s'il vous plaît confirmer que cela a fonctionné?

+0

ne fonctionne pas. J'ai ajouté? XDEBUG_SESSION_START = ECLIPSE_DBGP & KEY = 12632513094615 à chaque URL cURL (je prends les valeurs de mon URL comme lancé par Eclipse - la clé change à chaque fois). J'ai vérifié que c'est l'URL qui va dans cURL - en vain. –

+0

Oh ;-(Dommage ;-( –

+0

Merci d'avoir essayé! :) –

2

J'ai rencontré ce même problème. Je l'ai résolu en tournant la fonction de démarrage automatique hors dans php.ini:

xdebug.remote_autostart = 0 

, puis en ajoutant la clé API à l'URL de webservice qui appelle mon client webservice:

?XDEBUG_SESSION_START=<your API key here> 

et je Je ne sais pas si cela compte, mais j'ai entré la clé de l'API dans mon débogueur (MacGDBp). Maintenant, le débogueur se déclenche uniquement lorsque le script côté serveur du serveur Web est appelé, et non lorsque le client est démarré.

Espérons que cela aide.

7

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 » Peu importe si vous attachez "XDEBUG_SESSION = 1" à l'URL de CURL, mais ce qui est nécessaire est d'envoyer un cookie approprié avec la demande.

5

Je sais que c'est un vieux fil de discussion, mais j'ai pensé que je posterais mon expérience pour d'autres qui pourraient le rencontrer, comme moi, avec le même problème. Ce que j'ai découvert est que, si vous déboguez à distance (ce que je fais toujours), il y a quelques réglages que vous devez changer dans php.ini pour que cela fonctionne. 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 requête provient du serveur, cela ne fonctionnera donc pas. Au lieu de cela, vous devez utiliser le second paramètre pour indiquer à xdebug où trouver le client. J'espère que cela aidera quelqu'un à gagner un peu de temps!

3

Pour déclencher le débogueur la solution la plus simple est d'utiliser l'approche des cookies -b XDEBUG_SESSION=ECLIPSE_DBGP a fonctionné pour moi sur éclipse, 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 
Questions connexes