Pergunta

Estou usando o Eclipse e o Xdebug para desenvolver um aplicativo PHP que depende de serviços da Web. Eu tenho páginas de teste que consomem meus serviços de duas maneiras: Ajax (usando jQuery) e Curl.

Adicionei pontos de interrupção à minha página de serviço e iniciei o depurador. Quando chamo o serviço do Ajax, a execução para muito bem no ponto de interrupção e recebo minhas variáveis, controle passo a passo etc.

Mas quando eu chamo o serviço usando o CURL (ou seja, de uma página PHP), os pontos de interrupção não funcionam. Mesmo se eu ligar a opção depurador "Break at First Line", não consigo fazer a execução para parar ao usar o CURL.

É um comportamento de depurador? Preciso adicionar um sparedador às minhas chamadas de cacho? Alterar o URL? Ou é uma limitação xdebug?

Obrigado pelo seu tempo e esforço, cara

Foi útil?

Solução

Ainda não posso comentar, então posto isso como uma resposta.

Você pode depurar mais de uma solicitação de Ajax em uma sessão? Sua sessão de depuração ainda estava em execução no Eclipse quando você tentou depurar usando o CURL?

Descrição sobre como funciona para mim:

  1. Inicie a sessão de depuração com um arquivo simples debug.php que contém apenas um <?php e nada mais. Ele para na primeira linha, você "continua" e termina a execução.
  2. Agora solicite o script usando o CURL (ou outro navegador) adicionando? Xdebug_session_start = eclipse_dbgp ao seu caminho (eu até acho que essa adição é opcional)
  3. Seu script deve aparecer na visualização de depuração parada na primeira linha

Espero que isso ajude.

Outras dicas

Aqui está a dica sobre como acionar o cliente Xdebugger da Curl sem navegador:

1- Na linha de comando:

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);
?>

Portanto, não importa se você anexar "xdebug_session = 1" ao URL de curl, mas o que é necessário é enviar um cookie adequado junto com a solicitação.

Sei que este é um tópico bastante antigo, mas pensei em postar minha experiência para os outros que podem se deparar com ele, como eu, com o mesmo problema. O que eu descobri é que, se você está depurando remotamente (o que eu sempre faço), há algumas configurações que você precisa mudar no php.ini para fazer isso funcionar. Aqui estão os que funcionaram para mim:

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

A primeira configuração é normalmente "verdadeira" e diz ao Xdebug para procurar o cliente no mesmo endereço IP em que a solicitação HTTP foi originária. Nesse caso, no entanto, a solicitação vem do servidor, para que não funcione. Em vez disso, você deve usar a segunda configuração para informar ao Xdebug onde encontrar o cliente. Espero que isso ajude a salvar alguém um pouco!

Para acionar o depurador, a solução mais simples é usar a abordagem de cookie -b XDEBUG_SESSION=ECLIPSE_DBGP trabalhou para mim no Eclipse, veja abaixo:

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

Quando você está depurando o pedido de Ajax, que um é enviado pelo navegador, no mesmo contexto de navegação que o outro (não-ajax) Solicitações - e é por isso que funciona bem.


A solicitação enviada por Curl está em outro contexto diferente - e não tenho certeza se você pode conectar o depurador a isso ... Mas talvez...

Primeiro de tudo, aqui está uma informação que pode ser útil, citando o Documentação do Xdebug :

O Xdebug contém funcionalidade para acompanhar uma sessão de depuração quando iniciado através de um navegador: Cookies. Isso funciona como este:

  • Quando a variável URL XDEBUG_SESSION_START=name é anexado a um url xdebug emite um biscoito com o nome "XDEBUG_SESSION"E como valor o valor do XDEBUG_SESSION_STARTParâmetro URL.
  • Quando houver uma variável Get (ou Post) XDEBUG_SESSION_START ou o XDEBUG_SESSION Cookie está definido, o Xdebug tentará se conectar a um depuração.
  • Para parar uma sessão de depuração (e destruir o cookie), basta adicionar o parâmetro URL XDEBUG_SESSION_STOP. O Xdebug não tentará mais fazer uma conexão com o depurador.

Talvez possa funcionar se você definir esse cookie "manualmente", enviando -o para a solicitação de curl ...

Suponho que você teria que obter seu valor, conforme definido por Xdebug no início da sessão de depuração-reutilizar o cookie que você tem no seu navegador deve ser possível.

Nota: Eu nunca tentei isso - se você tentar, e funciona, poderia confirmar que funcionou?

Eu encontrei esse mesmo problema exato. Eu resolvi isso girando o recurso de início automático desligado em php.ini:

xdebug.remote_autostart = 0

e, em seguida, adicionando a chave da API ao URL da Web Service que meu cliente de serviço da web chama:

?XDEBUG_SESSION_START=<your API key here>

E não tenho certeza se isso importa, mas inseri a chave da API no meu depurador (MACGDBP). Agora, o depurador aciona apenas quando o script do lado do servidor Webervice é chamado, não quando o cliente é iniciado.

Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top