تسجيل الأخطاء وأفضل الممارسات
سجّلوا الأخطاء في الملفات واتبعوا أنماط معالجة الأخطاء المناسبة لبيئة الإنتاج
تسجيل الأخطاء وأفضل الممارسات درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
أهمية التسجيل
في بيئة الإنتاج، لا يمكنك عرض الأخطاء للمستخدمين، لكنك لا تزال بحاجة إلى معرفة متى تسوء الأمور. يلتقط التسجيل تفاصيل الأخطاء في ملفات أو خدمات، لتتمكن من التحقيق فيها لاحقًا.
error_log()
أبسط دالة للتسجيل — تكتب رسالة في سجل أخطاء PHP:
<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');
// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');التسجيل المنظم
سجّل البيانات المنظمة بصيغة JSON لتسهيل تحليلها والاستعلام عنها:
<?php
function logEvent(string $level, string $message, array $context = []): void {
$entry = array_merge([
'ts' => date('c'),
'level' => $level,
'message' => $message,
], $context);
error_log(json_encode($entry));
}
logEvent('ERROR', 'Payment failed', [
'order_id' => 123,
'amount' => 99.99,
'user_id' => 45,
]);مستويات السجل (PSR-3)
يحدّد PSR-3 مستويات قياسية للسجل:
- emergency — النظام غير قابل للاستخدام
- alert — يجب اتخاذ إجراء
- critical — حالات حرجة
- error — أخطاء وقت التشغيل
- warning — حالات استثنائية ليست أخطاء
- notice — أحداث طبيعية لكنها مهمة
- info — رسائل معلوماتية
- debug — معلومات تفصيلية لتصحيح الأخطاء
مسجّل Monolog
Monolog هي مكتبة التسجيل القياسية في PHP والمتوافقة مع PSR-3:
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));
$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);معالجة الاستثناءات في بيئة الإنتاج
معالج استثناءات ملائم لبيئة الإنتاج، يسجّل الخطأ ويُرجع استجابة آمنة:
<?php
set_exception_handler(function(\Throwable $e) {
$id = uniqid('err_');
error_log(json_encode([
'error_id' => $id,
'class' => get_class($e),
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
]));
http_response_code(500);
echo json_encode(['error' => 'Server error', 'id' => $id]);
exit(1);
});تدوير السجلات
تكبر ملفات السجل بلا حدود — دوّرها باستخدام logrotate في Linux أو المعالجات المستندة إلى الوقت في Monolog:
<?php
use Monolog\Handler\RotatingFileHandler;
$handler = new RotatingFileHandler(
'/var/log/app.log',
30, // keep 30 days
Logger::DEBUG
);
// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);تسجيل غني بالسياق
ضمّن سياق الطلب في كل إدخال في السجل لتسهيل تصحيح الأخطاء:
<?php
function getRequestContext(): array {
return [
'url' => $_SERVER['REQUEST_URI'] ?? '',
'method' => $_SERVER['REQUEST_METHOD'] ?? '',
'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
'user_id' => $_SESSION['user_id'] ?? null,
];
}
// Add to every log call:
$log->error('Order failed', array_merge(
getRequestContext(),
['order_id' => $orderId]
));تجنّب البيانات الحساسة في السجلات
لا تسجّل المعلومات الحساسة مطلقًا:
- كلمات المرور والرموز المميّزة
- أرقام بطاقات الائتمان
- البيانات الشخصية (امتثالًا للائحة GDPR)
- تتبعات مكدس الاستثناءات الكاملة في الاستجابات الموجّهة للمستخدمين
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);
// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');Sentry وتتبع الأخطاء الخارجي
في بيئة الإنتاج، استخدم خدمات تتبع الأخطاء مثل Sentry لتجميع الأخطاء وإطلاق التنبيهات بشأنها:
<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);
// Automatic capture of unhandled exceptions
// Manual capture:
try {
processOrder();
} catch (\Throwable $e) {
\Sentry\captureException($e);
throw $e;
}الشروط المسبقة المستندة إلى assert
استخدم التأكيدات لاكتشاف أخطاء البرمجة في بيئة التطوير:
<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');
// Or throw explicitly:
if (!is_int($userId)) {
throw new \InvalidArgumentException('userId must be int');
}تحقق سريع
وفقًا لمعيار PSR-3، ما مستوى السجل الذي يشير إلى حالة تتطلب اهتمامًا فوريًا؟
مراجعة: تسجيل الأخطاء
أفضل ممارسات التسجيل:
- استخدم التسجيل المنظم بصيغة JSON مع الطابع الزمني والمستوى والرسالة والسياق
- اتبع مستويات السجل في PSR-3
- استخدم Monolog في تطبيقات الإنتاج
- دوّر السجلات لمنع امتلاء القرص
- لا تسجّل كلمات المرور أو البيانات الحساسة مطلقًا
- استخدم Sentry أو أداة مشابهة لتتبع الأخطاء في الوقت الفعلي
الأسئلة الشائعة
هل درس «تسجيل الأخطاء وأفضل الممارسات» مجاني؟
نعم — نص درس «تسجيل الأخطاء وأفضل الممارسات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «تسجيل الأخطاء وأفضل الممارسات»؟
سجّلوا الأخطاء في الملفات واتبعوا أنماط معالجة الأخطاء المناسبة لبيئة الإنتاج تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تسجيل الأخطاء وأفضل الممارسات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنواع أخطاء PHP وإعدادات الإبلاغ عنها
- Try وCatch وFinally
- إنشاء استثناءات مخصّصة
- تسجيل الأخطاء وأفضل الممارسات