6.2إصلاح سريع
الأساسي في 30 ثانية
- المنعكس : عرض = أسباب محتملة = إجراء مستهدف — نشخص قبل لمس الشيفرة.
- القراءة : رسالة الخطأ تعطي الملف والسطر : الغلطة غالباً في السطر السابق.
- الإنتاج : كل فرق بين المحلي والخط يُعالج بالنسخ، وحالة الأحرف، وDocker ومتغيرات البيئة.
خيط رياد — الدليل الملصق بجانب الشاشة
رياد يحتفظ بهذا الدليل بجانب شاشته. الحكم بعد سنة : ثلاثة أسطر خدمته أكثر — الفاصلة المنقوطة الناقصة في السطر السابق، والاستعلام المدمج الذي فتح حقناً، والسر الذي كاد يذهب في Git. لكل منها، انتهى بتطبيق التسلسل (قراءة الخطأ، والتحقق من السبب، والتصحيح) بدل التعديل عشوائياً.
عرض ملاحظ، وأسباب متحقق منها، وإجراءات بالترتيب : المنعكس يتم في ثلاثة أوقات.
التشخيص قبل إعادة التشغيل
مشكلة PHP نادراً ما تُحل عشوائياً : لكل عرض أسباب نمطية وإجراء مستهدف. الجدول أدناه يجمع الحالات الأكثر شيوعاً، من الصياغة إلى النشر.
| العَرَض | الأسباب المحتملة | الإجراءات |
|---|---|---|
| « syntax error, unexpected... » في سطر يبدو صحيحاً | فاصلة منقوطة أو قوس/عارضة ناقصة في السطر السابق | التحقق من السطر السابق ؛ تفعيل عرض الأخطاء في التطوير ؛ المسافة البادئة (0.3, 1.x) |
| متغيري لا يظهر (نص حرفي $nom) | علامات مفردة (حرفي) بدل المزدوجة ؛ أو حالة أحرف المتغير ($nom ≠ $Nom) | علامات مزدوجة أو دمج ؛ التحقق من حالة أحرف المتغير بدقة (1.1) |
| $_POST فارغ أو شرط يتجاهل « 0 » | طريقة خاطئة (GET مقابل POST) ؛ قيمة « falsy » (0, '', '0') مختبرة بشكل سيئ | التحقق من method النموذج ؛ الاختبار صراحة (isset, !== '', === 0) بدل if ($x) (1.2, 2.1) |
| ثغرة : حقن SQL ممكن | بيانات مدمجة في استعلام SQL | دائماً استعلامات محضرة (prepared statement) (PDO : علامات + execute) ؛ أبداً دمج (3.1) |
| ثغرة : XSS (سكربت محقون يُنفذ) | بيانات معروضة دون هروب | الهروب عند العرض بـ htmlspecialchars() ؛ محركات القوالب تهرب افتراضياً (3.4) |
| سر تسرب (كلمة مرور قاعدة، ومفتاح) | سر مكتوب مكشوفاً أو منسخ في Git | إعادة التوليد فوراً ؛ النقل إلى متغير بيئة (.env خارج المستودع) ؛ أبداً نسخ .env (3.1, 5.4) |
| Class not found / تحميل تلقائي مكسور | نطاق (namespace) غير متسق مع التحميل التلقائي PSR-4 ؛ محمل تلقائي غير متجدد ؛ vendor/ غائب | التحقق من namespace مقابل المسار (PSR-4) ؛ composer dump-autoload ؛ composer install (3.3) |
| استعلام N+1 / تطبيق بطيء | استعلام لكل عنصر (ORM) ؛ استعلامات غير مفهرسة ؛ لا تخزين مؤقت | التحميل المسبق للعلاقات (eager loading) ؛ فهرسة الأعمدة المطلوبة ؛ التخزين المؤقت (Redis) ؛ التحليل قبل (5.2) |
| « يعمل محلياً لكن لا يعمل على الخط » | بيئة مختلفة (نسخة PHP، وامتدادات، وحالة أحرف Windows/Linux، وإعداد) | مواءمة النسخ ؛ الصرامة في حالة أحرف الملفات ؛ التحويل إلى حاويات (Docker) ؛ إعداد حسب البيئة (0.2, 5.3) |
| أخطاء مفصلة معروضة في الإنتاج | display_errors بقي مفعلاً (إعداد تطوير منشور كما هو) | تعطيل العرض، وتسجيل الأخطاء ؛ تكييف الإعداد مع الإنتاج (5.4) |
نص جاهز للقول — تشخيص دون لمس عشوائي (30 ثانية)
« عرضي : [syntax error / متغير حرفي / POST فارغ / حقن / بطء / فرق الإنتاج]. أقرأ الملف والسطر، وأحدد السبب المحتمل للدليل، وأطبق الإجراء المستهدف وأتحقق. »
نموذج نسخ ولصق — قاعدة أخطاء سليمة (تطوير مقابل إنتاج)
prepare("SELECT id FROM articles WHERE id = :id");
$stmt->execute(["id" => $id]);
} catch (PDOException $e) {
error_log($e->getMessage());
echo $enProd ? "Service indisponible." : $e->getMessage();
}
شركة صغيرة جداً / ميزانية صغيرة
لا جدول رسمي : عرض واحد، والسبب المحتمل للدليل، والإجراء والمسؤول مدون.
شركة صغيرة ومتوسطة في قسنطينة
دمج الواقع المحلي في التشخيص : النسخ المثبتة، والحواسيب المشتركة، وذروات النشاط المعروفة.
عن بعد / هجين
إضافة السجلات المكتوبة الفورية إلى الإجراءات : عن بعد، عرض غير مدون يشبه نظاماً يعمل.
بين الثقافات
توضيح الملاحظات كتابة : ما يبدو بديهياً (أي نسخة، وأي بيئة) ليس كذلك للجميع.
تحدي 48 ساعة — طبّق غداً
حدد عرضاً حالياً واحداً (خطأ صياغة، وPOST فارغ، وبطء)، وطبق سطر الدليل (رسالة مقروءة + سبب متحقق منه + إجراء مستهدف).
- أعرف ربط العرض بأسبابه المحتملة.
- أقرأ ملف + سطر قبل التصحيح.
- أعرف الإحالة نحو المستوى المعمق لحالتي.
صفحة رياد تعرض سكربتاً أدخله زائر بدل عرضه كنص. أي منعكس يطبق الدليل ؟
نفس العرض الذي يعود ليس عشر أعطال : إنه منعكس ناقص يجب تثبيته (السطر السابق، وحالة الأحرف الدقيقة، وisset الصارم، والمحضرة، وhtmlspecialchars، و.env، وdump-autoload).