مقدمة: لماذا يخاف المطورون من الشاشة البيضاء؟
\n\nكل مطور PHP واجه مرة على الأقل هذا الموقف: الكتب مكتوب بشكل صحيح، لكن بدلاً من النتيجة تظهر صفحة فارغة. لا أخطاء، لا تحذيرات. فقط صمت وعرق بارد. هل يبدو ذلك مألوفًا؟
\n\nعلى Stack Overflow، سؤال «How do I get PHP errors to display?» حصل على آلاف المشاهدات ومئات الإجابات. هذا ليس صدفة: القدرة على تفعيل ومعالجة الأخطاء بشكل صحيح هي مهارة أساسية توفر ساعات من التصحيح. لكن هناك فارق بسيط: الإعدادات الخاطئة قد لا تساعد فقط، بل قد تقلل من أداء موقعك أو، الأسوأ من ذلك، تفتح ثغرات أمنية.
\n\nفي هذه المقالة، سنستعرض جميع طرق تفعيل عرض أخطاء PHP — من الحلول السريعة للتطوير المحلي إلى الإعدادات الآمنة لخادم الإنتاج. وبالطبع، سنتحدث عن تحسين الأداء: كيف لا تملأ السجلات ولا تبطئ موقعك.
\n\nنبذة سريعة: ما هي أنواع أخطاء PHP؟
\n\nقبل تفعيل العرض، من المفيد فهم ما نتعامل معه. PHP يولد عدة مستويات من الأخطاء:
\n\n- \n
- E_ERROR — خطأ فادح. يتوقف السكريبت. مثال: نفاد الذاكرة، استدعاء كلاس غير موجود. \n
- E_WARNING — غير فادح. يستمر السكريبت لكن هناك خطأ. مثال: تضمين ملف غير موجود. \n
- E_NOTICE — إشعار. عادةً عن مشاكل بسيطة (متغير غير معرف). \n
- E_PARSE — خطأ نحوي. يحدث قبل تنفيذ الكود، يصعب التقاطه في وقت التشغيل. \n
- E_ALL — يشمل جميع المستويات باستثناء E_STRICT (قبل PHP 8.0). \n
تذكر: في مرحلة التطوير، نريد رؤية جميع الأخطاء. على الخادم الحي، فقط الأخطاء الحرجة، وفي السجلات وليس على الشاشة.
\n\nالطريقة الأولى: سريعة ومباشرة — داخل الكود
\n\nأسهل طريقة للتصحيح لمرة واحدة هي إضافة سطرين سحريين في بداية السكريبت:
\n\n<?php\nini_set('display_errors', 1);\nini_set('display_startup_errors', 1);\nerror_reporting(E_ALL);\n?>\n\nماذا يحدث هنا؟
\n- \n
display_errors— يفعل عرض الأخطاء على الشاشة. \n display_startup_errors— يعرض الأخطاء التي حدثت عند بدء تشغيل PHP (مثل أخطاء php.ini). \n error_reporting(E_ALL)— يضبط مستوى الإبلاغ: عرض كل شيء. \n
هذه الطريقة مثالية لملف واحد تقوم بتصحيحه. لكن هناك عيوب: يجب أن تتذكر حذف هذه الأسطر قبل النشر على الإنتاج. وإلا فإنك تخاطر بعرض «أحشاء» تطبيقك للمستخدمين.
\n\nالطريقة الثانية: إعداد php.ini — بشكل شامل ودائم
\n\nإذا كنت تعمل على جهاز محلي أو تتحكم في الخادم، فمن الأسهل تعديل php.ini. ابحث عن هذا الملف (عادةً في /etc/php/ أو /usr/local/etc/php/) وقم بتغيير التوجيهات التالية:
\n\ndisplay_errors = On\ndisplay_startup_errors = On\nerror_reporting = E_ALL\n\nبعد التغييرات، لا تنس إعادة تشغيل خادم الويب:
\nsudo systemctl restart apache2\n# أو\nsudo systemctl restart nginx php8.1-fpm\n\nهام: على خادم الإنتاج، يجب أن يكون display_errors Off. بدلاً من ذلك، قم بإعداد تسجيل الأخطاء في ملف:
display_errors = Off\nlog_errors = On\nerror_log = /var/log/php_errors.log\nerror_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT\n\nهذا يقلل الحمل على الإخراج ويحمي بيانات الموقع.
\n\nالطريقة الثالثة: عبر .htaccess — للاستضافة المشتركة
\n\nإذا لم يكن لديك وصول إلى php.ini (مثل الاستضافة الرخيصة)، استخدم ملف .htaccess في جذر الموقع:
\n\nphp_flag display_errors on\nphp_flag display_startup_errors on\nphp_value error_reporting 32767