سؤال

أنا أستخدم Eclipse و Xdebug لتطوير تطبيق PHP يعتمد على خدمات الويب. لدي اختبار صفحات تستهلك خدماتي بطريقتين: Ajax (باستخدام JQuery) وحلل.

أضف نقاط التوقف إلى صفحة الخدمة الخاصة بي وإطلاق المصحح. عندما استدعاء الخدمة من AJAX، يتوقف التنفيذ بشكل جيد عند نقطة التوقف، وأحصل على المتغيرات الخاصة بي، تحكم خطوة بخطوة وما إلى ذلك.

ولكن عندما استدعاء الخدمة باستخدام Curl (أي من داخل صفحة PHP)، تفشل نقاط التوقف في العمل. حتى لو قمت بتشغيل خيار مصحح الأخطاء "Break في السطر الأول"، لا يمكنني الحصول على التنفيذ للتوقف عند استخدام Curl.

هل هو سلوك مصحح الأخطاء؟ هل أحتاج إلى إضافة سذم إلى مكالمات حليقة الخاص بي؟ تغيير عنوان URL؟ أم أنها قيود Xdebug؟

شكرا على وقتك والجهد، الرجل

هل كانت مفيدة؟

المحلول

لا أستطيع التعليق حتى الآن، لذلك أنا نشر هذا كإجابة.

يمكنك تصحيح أكثر من طلب واحد AJAX في جلسة واحدة؟ هل ما زالت جلسة التصحيح الخاصة بك تعمل في الكسوف عندما حاولت تصحيح التصحيح باستخدام Curl؟

وصف حول كيفية عملها بالنسبة لي:

  1. بدء تشغيل جلسة تصحيح مع ملف Debug.php بسيط يحتوي فقط على <?php ولا شيء آخر. يتوقف على السطر الأول، أنت "تواصل" ذلك وينتهي الأمر إلى التنفيذ.
  2. اطلب الآن النصي باستخدام حليقة (أو متصفح آخر) مضيفا؟ Xdebug_session_start = eclipse_dbgp إلى مساره (حتى أعتقد أن هذه الإضافة اختيارية)
  3. يجب أن تظهر البرنامج النصي الخاص بك في عرض التصحيح في السطر الأول

الأمل يساعد.

نصائح أخرى

هنا نصيحة حول كيفية تشغيل عميل XDEBUGGER من Curl بدون متصفح:

1- من سطر الأوامر:

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

2- من 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);
?>

لذلك لا يهم إذا قمت بإرفاق "Xdebug_session = 1" لحضور عنوان URL الخاص بك، ولكن ما هو ضروري هو إرسال ملف تعريف ارتباط مناسب مع الطلب.

أعلم أن هذا موضوع قديم جدا، لكنني اعتقدت أنني سأقوم بنشر تجربتي للآخرين قد صادفها، كما فعلت، مع نفس المشكلة. ما اكتشفته هو أنه، إذا كنت تقوم بتصحيح الأخطاء عن بعد (الذي أفعله دائما)، فهناك إعدادات زوجين يجب تغييرها في PHP.INI لجعل هذا العمل. هنا هي تلك التي عملت بالنسبة لي:

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

الإعداد الأول هو عادة "صحيح"، ويخبر XDebug البحث عن العميل في نفس عنوان IP حيث نشأ طلب HTTP. في هذه الحالة، ومع ذلك، فإن الطلب قادما من الخادم، بحيث لن يعمل. بدلا من ذلك، يجب عليك استخدام الإعداد الثاني لإخبار XDebug أين للعثور على العميل. آمل أن يساعد هذا في إنقاذ شخص ما بعض الوقت!

لتشغيل مصحح الأخطاء، يكون الحل أبسط هو استخدام نهج ملفات تعريف الارتباط -b XDEBUG_SESSION=ECLIPSE_DBGP عملت بالنسبة لي على الكسوف، انظر أدناه:

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

عند تصحيح طلب AJAX، يتم إرسال المرء من قبل المتصفح، في سياق التنقل نفسه الآخر (غير AJAX) الطلبات - وهذا هو السبب في أنه يعمل بشكل جيد.


يجب أن يكون الطلب المرسل بواسطة Burl في سياق آخر ومختلف - ولست متأكدا من أنه يمكنك ربط المصحح في ذلك ... ولكن، ربما ...

بادئ ذي بدء، إليك معلومات قد تكون مفيدة، نقلا عن وثائق XDEBUG. :

يحتوي XDebug على وظائف لتتبع جلسة تصحيح الأخطاء عند بدء تشغيل مستعرض: ملفات تعريف الارتباط. هذا يعمل مثل هذا:

  • عندما متغير عنوان URL XDEBUG_SESSION_START=name يتم إلحاره إلى عنوان URL XDebug ينبعث من ملف تعريف الارتباط باسم "XDEBUG_SESSION"وكقيمة قيمة XDEBUG_SESSION_STARTمعلمة URL.
  • عندما يكون هناك متغير الحصول على (أو بعد) XDEBUG_SESSION_START أو ال XDEBUG_SESSION تم تعيين ملف تعريف الارتباط، سيحاول XDebug الاتصال ب DebugClient.
  • لإيقاف جلسة تصحيح (ولإضافة ملف تعريف الارتباط)، ما عليك سوى إضافة معلمة URL XDEBUG_SESSION_STOPوبعد بعد ذلك، لن يحاول Xdebug تقديم اتصال إلى DebugClient.

ربما قد تعمل إذا قمت بتعيين ملف تعريف الارتباط "باليد"، وإرسالها allong طلب حليقة ...

أفترض أن عليك أولا الحصول على قيمتها، كما حددها XDebug في بداية جلسة تصحيح الأخطاء - إعادة استخدام ملف تعريف الارتباط لديك في متصفحك يجب أن تكون ممكنة، رغم ذلك.

ملاحظة: لم أحاول أبدا ذلك - إذا حاولت، ويعمل، هل يمكن أن تؤكد ذلك؟

ركضت هذه المشكلة بالضبط نفسها. أنا حلها عن طريق تحويل ميزة البدء التلقائي إيقاف في php.ini:

xdebug.remote_autostart = 0

ثم قم بإضافة مفتاح API إلى عنوان URL WebService الذي يستدعي عميل WebService الخاص بي:

?XDEBUG_SESSION_START=<your API key here>

ولست متأكدا مما إذا كانت هذه الأمور، لكنني أدخلت مفتاح API في مصححي (MACGDBP). الآن ينطلق المصحح الآن عند استدعاء البرنامج النصي من جانب WeberVice Server، وليس عند بدء تشغيل العميل.

أتمنى أن يساعدك هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top