كلُّ دليلٍ لمشكلةٍ في PHP يبدأ بـ «فعّل display_errors». وعلى موقعٍ حيّ يطبع ذلك مساراتِ ملفّاتك وإطارَ عملك، واسمَ قاعدة بياناتك أحيانًا، لكلّ من يستطيع أن يجعل الصفحة تخطئ — ومنهم من يحاول ذلك.
الإعدادات الصحيحة للحيّ
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/mysite-error.log
error_reporting = E_ALL & ~E_DEPRECATED
E_ALL بلا تنبيهات الهجران يُبقي السجلَّ مقروءًا في شفرةٍ قديمة، ويظلّ يسجّل كلّ ما هو خطأٌ فعلًا.
راقبه وأنت تُعيد إنتاج العطب
tail -f /var/log/php/mysite-error.log
اترك ذلك يعمل وحمّل الصفحةَ المكسورة. فتنال المعلوماتِ نفسها التي كان display_errors سيعرضها، في اللحظة نفسها، بلا أن يراها زائرٌ قطّ.
وإن لزم أن تراه في المتصفّح
أظهره لنفسك وحدك، بالعنوان:
if ((@$_SERVER["REMOTE_ADDR"] ?? "") === "YOUR.IP.HERE") {
ini_set("display_errors", "1");
error_reporting(E_ALL);
}
ضع ذلك خلف فحصٍ لا يمكن أن تنسى إزالته — ثابتٌ في ملفّ إعدادٍ لا يُنشَر، لا سطرٌ مُعطَّل بتعليق. فالسطرُ المعطَّل بتعليقٍ يُعاد تفعيله.
سجلٌّ ينمو أسرع من اللازم
sort /var/log/php/mysite-error.log | uniq -c | sort -rn | head -5
تنبيهٌ واحد في كلّ طلبٍ يكتب غيغابايتات في يوم. والسطرُ الأوّل من ذلك الخرج هو المشكلةُ كلُّها في الغالب الأعمّ.
أعد تنبيهات الهجران يومًا قبل ترقية PHP. فهي التحذيرات التي تصير أخطاءً في الإصدار التالي، وقراءتها مبكّرًا أرخص تحضيرٍ ممكن.