سؤال

في إحدى الصفحات أقوم بإجراء مكالمات AJAX متعددة.تقوم جميع المكالمات بإرجاع الاستجابات بنجاح ولكن المكالمة الأخيرة (غير المرتبطة بمكالمات Ajax الأخرى) تُرجع 500 خطأ داخلي في الخادم كرمز استجابة (كما يخبرنا Firebug).ومع ذلك، على الرغم من رمز الخطأ، يتم إرجاع المحتوى الصحيح من استدعاء AJAX هذا.

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

بالمناسبة، أنا أستخدم Apache وJQuery وPHP5 وAPC (إذا كان ذلك مناسبًا).

لا يوجد حل صحيح

نصائح أخرى

الإجابة الأكثر ترجيحًا، نظرًا لمحدودية المعلومات المتاحة، هي أن PHP تصل إلى خطأ فادح بعد لقد انتهى من تكرار مخرجاتك المتوقعة.

لاختبار:في السطر الذي تم تنفيذه أخيرًا، قم بتكرار شيء ما.إذا لم يظهر هذا الصدى، فأنت تعلم أن برنامج PHP النصي الخاص بك متوقف في مكان ما.عند هذه النقطة، يكون الأمر مجرد مسألة تصحيح الأخطاء وتتبعها.

هذا غريب جدا ... هل تستخدم نوعا من الملفات أو رمز آخر أنت لم تكتب قد تؤثر ذلك على رأس رمز الحالة بشكل مستقل عن القيمة الفعلية التي تم إرجاعها؟

كان لي هذه القضية نفسها بالضبط، تحولت إلى أن يكون خطأ فادح مخفي. قم بتشغيل Display_Errors، ابحث عن خطأ، خطأ Smash، قم بإيقاف تشغيل Display_Errors (ربما الأفضل للحفاظ على Display_errors على التنمية وإيقاف الإنتاج).

تعطل PHP مترجم ببساطة خلال هذا الطلب الواحد. أنا أعرف سبب محتمل واحد يمكن أن تحطم PHP:

نظرا لبعض الأخطاء في دول مجلس التعاون الخليجي 4.3، تتميز PHP المترجمة مع هذا الإصدار من برنامج التحويل البرمجي بتنفيذ الاستثناءات المكسورة. في بعض الحالات غير التافهة، يؤدي إلقاء استثناء من البرنامج إلى البرنامج النصي إلى إنهاء Segfault ويتم إنهاء تنفيذ البرنامج النصي. تم تأكيد الأطروحة من قبل فريق PHP قبل شهرين.

للتحقق من ذلك، سواء حدث لك، يمكنك ببساطة التحقق، حيث تعطل تنفيذ البرنامج النصي، وإذا حدث بعد إلقاء استثناء، فأنت في المنزل. يمكن إجراء الشيك عن طريق وضع die() مزيد من وفتحت في البرنامج النصي وانظر، ماذا يحدث. طريقة أخرى هي استخدام declare(ticks=1) وتسجيل وظيفة القراد التي توفر آخر إدخال من debug_backtrace() إلى الملف كل علامة، بحيث ستحصل على تقرير، وكيف يتم تنفيذ البرنامج النصي.

لقد كان لدي مشكلة مماثلة إلى حد ما وكانت المشكلة هي أن البرنامج النصي كان يرمي الاستثناءات وليس هناك كتلة الصيد حتى يكون الاستثناء قد يكون فقهورا على السطح والخطأ القاتل "استثناء غير مصراعي" حدث. وهو سلوك PHP القياسي ولكن على خادم معين ستحصل أيضا على رمز استجابة 500 خطأ خادم داخلي بدلا من 200 موافق. إزالة الاستثناءات واستبدالها ببيانات يموت () تم إصلاح المشكلة على هذا الخادم (يمكننا أن نفعل ذلك لأنه كان نص بسيط لم يستفد حقا من الاستثناءات في المقام الأول)

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

يمكن قراءة المزيد من المعلومات في http://www.larshemel.com/forum/500_internal_server_error.

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