Bir PHP web hizmeti sayfasını iz XDebug kullanma

6 Cevap php

I'm using Eclipse and XDebug to develop a PHP application that relies on web services. I have test pages that consume my services in 2 ways: AJAX (using jQuery) and cURL.

Ben benim servis sayfasına kesme noktaları eklemek ve hata ayıklayıcı başlatın. Ben AJAX servis çağırdığınızda, yürütme kesme noktasında güzel durur, ve benim değişkenleri olsun adım adım vb kontrol

Ben cURL (yani bir PHP sayfası içinde) kullanarak hizmetini aradığınızda Ancak, kesme noktaları çalışması başarısız. Ben debugger seçeneği "ilk satırında break" açmak bile, ben cURL kullanarak durdurmak için yürütme alınamıyor.

Bir hata ayıklayıcı davranış mı? Benim cURL çağrılara bir hearder eklemek gerekir mi? URL Alter? Ya da bir XDebug sınırlama?

Thanks for your time and effort, Guy

6 Cevap

Henüz yorum yapamam, bu yüzden bir cevap olarak bu yazı.

Can you debug more than one AJAX request in one session? Was your debug session still running in Eclipse when you tried to debug using cURL?

Benim için nasıl çalıştığı hakkında Açıklama:

  1. Sadece <?php ve başka bir şey içeren basit debug.php dosya ile hata ayıklama oturumu başlatın. O bunu "devam", ilk satırda durur ve yürütme bitirir.
  2. Şimdi (ben bile bu eklenmesi isteğe olduğunu düşünüyorum) kendi yoluna? XDEBUG_SESSION_START = ECLIPSE_DBGP ekleyerek komut kullanarak cURL (veya başka bir tarayıcı) talep
  3. Script ilk satırda durdu hata ayıklama görünümünde göstermek gerekir

Umut ths olur.

İşte tarayıcı olmadan Curl adlı Xdebugger müşteri tetiklemek için nasıl bir ipucu:

1 - Komut satırından:

curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php

2 - PHP Kimden

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

Bu yüzden URL kıvırmak için "XDEBUG_SESSION = 1" eklerseniz önemli, ama ne gerekli isteği ile birlikte uygun bir çerez göndermek için değildir.

Eğer Ajax isteği ayıklarken, o bir başka (non-Ajax) istekleri aynı gezinti bağlamda, tarayıcı tarafından gönderilen - iyi çalışıyor neden olan.


The request sent by curl is in another, different, context -- and I'm not sure you can hook the debugger into that... But, maybe...

Her şeyden önce, burada alıntı, yararlı kanıtlamak olabilecek bir bilgi bulunuyor Xdebug's documentation:

Xdebug contains functionality to keep track of a debug session when started through a browser: cookies. This works like this:

  • When the URL variable XDEBUG_SESSION_START=name is appended to an URL Xdebug emits a cookie with the name "XDEBUG_SESSION" and as value the value of the XDEBUG_SESSION_START URL parameter.
  • When there is a GET (or POST) variable XDEBUG_SESSION_START or the XDEBUG_SESSION cookie is set, Xdebug will try to connect to a debugclient.
  • To stop a debug session (and to destroy the cookie) simply add the URL parameter XDEBUG_SESSION_STOP. Xdebug will then no longer try to make a connection to the debugclient.

O tanımlama ayarlarsanız belki kıvırmak istek allong göndererek, "elle" işe yarayabilir ...

Hata ayıklama oturumu başında Xdebug tarafından belirlenen gibi, önce onun değerini almak zorunda herhalde - yeniden kullanarak tarayıcınızda sahip tanımlama olsa da, mümkün olmalıdır.

Note : I've never tried this -- if you try, and it works, could you please confirm it worked ?

Ben bu aynı tam sorunu içine koştu. Ben otomatik başlatma özelliği off php.ini döndürerek çözüldü:

xdebug.remote_autostart = 0

ve sonra benim Webcoder müşteri aramaları webservice URL'ye API anahtarını ekleyerek:

?XDEBUG_SESSION_START=<your API key here>

ve ben bu konularda emin değilim, ama benim hata ayıklayıcı (MacGDBp) içine API anahtarı girdi. Şimdi ayıklayıcı, istemci başlatıldığında zaman değil, webervice sunucu tarafı komut dosyası denir sadece yukarı patlar.

Umarım bu yardımcı olur.

Bu oldukça eski bir konu olduğunu biliyorum, ama ben yaptım gibi aynı sorunu ile, karşıya gelebilir diğerleri için benim deneyim göndermek düşündüm. Ne keşfetti uzaktan (Ben her zaman yapmak) ayıklarken iseniz, bu işi yapmak için php.ini değiştirmek zorunda birkaç ayar vardır, olmasıdır. İşte benim için çalışmış olanlar:

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

İlk ayar "gerçek" normal ve HTTP isteği kökenli aynı IP adresinde istemci aramak için XDebug söyler. Bu durumda, bununla birlikte, bu istek sunucudan gelen, bu nedenle bu çalışmaz. Bunun yerine nerede müşteri bulmak XDebug anlatmak için ikinci ayarını kullanmanız gerekir. Bu Birine biraz zaman kazanmak yardımcı olur umarım!

Ayıklayıcısını basit çözüm tetiklemek için aşağıya bakın, -b XDEBUG_SESSION=ECLIPSE_DBGP Tutulma benim için çalıştı tanımlama yaklaşımı kullanmak için:

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