مراقبة تطبيقات PHP: المقاييس والتنبيهات
تطبيقات PHP الحديثة تعمل في بيئات موزعة معقدة، حيث يمكن أن تكلف الأعطال وانخفاض الأداء الشركات الملايين. بدون نظام مراقبة، فإنك تخاطر بمعرفة المشكلة فقط من المستخدمين. في هذه المقالة، سنشرح كيفية إعداد مراقبة كاملة لتطبيقات PHP، وما هي المقاييس التي يجب تتبعها وكيفية إعداد التنبيهات للاستجابة السريعة.
لماذا تعتبر مراقبة PHP أمرًا بالغ الأهمية
لا تزال PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب (وفقًا لبيانات W3Techs، أكثر من 75% من المواقع تستخدم PHP). ومع ذلك، فإن طبيعتها التفسيرية وخصائص التعامل مع الذاكرة تتطلب اهتمامًا خاصًا. بدون مراقبة، لن تتمكن من:
- اكتشاف تسرب الذاكرة قبل أن يؤدي إلى تعطل الخادم
- تحديد الاستعلامات البطيئة لقاعدة البيانات
- الكشف عن أجزاء الكود غير الفعالة
- التنبؤ بالحمل وتوسيع نطاق البنية التحتية
تتكون المراقبة الفعالة من ثلاثة مكونات: جمع المقاييس، التصور، والتنبيه. دعنا نستعرض كل مرحلة عمليًا.
المقاييس الرئيسية لتطبيقات PHP
للمراقبة الكاملة، من الضروري تتبع مجموعات المقاييس التالية:
مقاييس الأداء (APM)
- وقت الاستجابة (النسب المئوية p50, p95, p99)
- سعة المعالجة (RPS – طلب في الثانية)
- وقت تنفيذ السكريبت (max_execution_time)
- عدد الأخطاء (5xx، الاستثناءات)
المقاييس النظامية
- تحميل CPU واستخدام ذاكرة PHP-FPM
- عدد العمليات النشطة لـ PHP-FPM
- استخدام مساحة القرص للسجلات
- حركة مرور الشبكة والتأخيرات
مقاييس الأعمال
- عدد المدفوعات الناجحة
- سرعة تحميل الصفحات
- معدل التحويل في المسار التسويقي
التنفيذ العملي: جمع المقاييس باستخدام Prometheus
لنستعرض مثالًا على دمج تطبيق PHP مع Prometheus – أحد أشهر أدوات المراقبة. للعمل مع Prometheus في PHP، نستخدم المكتبة promphp/prometheus_client_php.
التثبيت عبر Composer:
composer require promphp/prometheus_client_phpمثال على تسجيل واستخدام العداد (Counter) والمدرج التكراري (Histogram):
<?phpuse Prometheus\\CollectorRegistry;use Prometheus\\Storage\\InMemory;use Prometheus\\RenderTextFormat;
// تهيئة التخزين (في الإنتاج استخدم Redis أو APCu)$registry = new CollectorRegistry(new InMemory());
// عداد لتتبع عدد الأخطاء$errorCounter = $registry->registerCounter( 'app_errors_total', 'Total number of application errors', ['type', 'endpoint']);
// مدرج تكراري لوقت الاستجابة$requestDuration = $registry->registerHistogram( 'http_request_duration_seconds', 'HTTP request duration in seconds', ['method', 'endpoint'], [0.1, 0.5, 1, 2, 5, 10] // الحاويات);
// Middleware لجمع المقاييسfunction monitorRequest(callable $handler) { global $requestDuration, $errorCounter; $start = microtime(true); try { $result = $handler(); $duration = microtime(true) - $start; // تسجيل وقت التنفيذ $requestDuration->observe($duration, [ $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'] ]); return $result; } catch (\\Throwable $e) { // زيادة عداد الأخطاء $errorCounter->inc([ get_class($e), $_SERVER['REQUEST_URI'] ]); throw $e; }}
// نقطة النهاية لـ Prometheus (عادة /metrics)function metricsEndpoint()
```