مقدمة: لماذا يعتبر تحليل كود PHP مهمًا؟
\nكل مطور واجه مرة واحدة على الأقل موقفًا حيث يبدأ موقع أو تطبيق PHP في العمل ببطء. تستغرق الصفحات 10 ثوانٍ للتحميل، وتتجمد البرامج النصية، ويستهلك الخادم المزيد والمزيد من الموارد. في مثل هذه اللحظات، نادرًا ما تساعد التخمينات البديهية والإصلاحات "العمياء" - فأنت تخاطر بإضاعة ساعات في تحسين الجزء الخطأ من الكود.
\nهنا يأتي دور تحليل كود PHP. إنها عملية جمع بيانات حول وقت التنفيذ واستهلاك الذاكرة لكل جزء من البرنامج. يسمح لك التحليل بتحديد الوظائف والاستعلامات التي تخلق "نقاط اختناق" (bottlenecks) بدقة، وتوجيه الجهود نحو إزالتها.
\nفي هذه المقالة، سنشرح أساسيات التحليل للمبتدئين: ما هي الأدوات الموجودة، وكيفية تثبيتها وتفسير النتائج. ستتعلم كيفية إيجاد المشكلات دون تخمين أو سحر.
\n\n1. الأدوات الرئيسية لتحليل PHP
\nهناك العديد من الأدوات الشائعة لتحليل PHP. سننظر في اثنتين رئيسيتين: Xdebug (مجاني، مدمج) و Blackfire.io (متقدم، بواجهة رسومية).
\n\n1.1 Xdebug - كلاسيكيات التحليل
\nXdebug هو امتداد لـ PHP، والذي بالإضافة إلى التصحيح، يمكنه إنشاء ملفات تحليل (cachegrind). يمكن تحليل هذه الملفات باستخدام أدوات مساعدة خاصة، مثل KCachegrind (لينكس) أو WinCacheGrind (ويندوز).
تثبيت Xdebug:
\n- \n
- تأكد من تثبيت PHP (الإصدار 7.4+). \n
- نفذ الأمر:
pecl install xdebug(أو استخدم مدير الحزم لنظام التشغيل الخاص بك). \n - أضف الأسطر التالية إلى
php.ini: \n
zend_extension=xdebug.so\nxdebug.mode=profile\nxdebug.output_dir=/tmp/profiling\nبعد ذلك، سيقوم كل طلب بإنشاء ملف تحليل في الدليل المحدد.
\n\n1.2 Blackfire.io - محلل سحابي حديث
\nBlackfire هي أداة تجارية (مع حد مجاني) توفر واجهة ويب لتحليل الأداء. تقوم تلقائيًا ببناء رسوم بيانية للاستدعاءات وتظهر وقت تنفيذ كل دالة.
\nبداية سريعة مع Blackfire:
\n- \n
- قم بتثبيت Blackfire Agent و Probe (التعليمات على الموقع الرسمي). \n
- ابدأ التحليل من خلال إضافة المتصفح أو أمر CLI: \n
blackfire curl http://example.com/slow-page.php\nسيتم فتح النتيجة في واجهة الويب مع رسوم بيانية توضيحية.
\n\n2. كيفية تفسير نتائج التحليل
\nبعد الحصول على بيانات التحليل، تحتاج إلى فهم ما يجب النظر إليه أولاً. دعنا نلقي نظرة على تقرير نموذجي باستخدام Xdebug + KCachegrind.
\n\n2.1 المقاييس الرئيسية
\n- \n
- Self Time (الوقت الخاص) - وقت تنفيذ الدالة نفسها دون احتساب الاستدعاءات المتداخلة. هذا هو المؤشر الرئيسي للعمليات "الثقيلة". \n
- Cumulative Time (الوقت التراكمي) - وقت تنفيذ الدالة مع جميع الاستدعاءات الفرعية. \n
- Number of Calls - عدد مرات استدعاء الدالة. أحيانًا لا تكون المشكلة في دالة واحدة بطيئة، بل في آلاف الاستدعاءات السريعة. \n
2.2 مثال على التحليل
\nلنفترض أنك قمت بتحليل صفحة كتالوج المنتجات ورأيت أن الدالة getProductPrice() لها وقت تراكمي كبير. عند توسيعها، تلاحظ أنه يتم استدعاء getDiscountFromDB() داخلها - وهي التي تستهلك 80% من الوقت.
الآن أنت تعرف ما يجب تحسينه: إما تخزين الخصومات مؤقتًا أو إعادة كتابة استعلام SQL.
\n<?php\n// مثال على دالة "ثقيلة"\nfunction getDiscountFromDB($productId) {\n // استعلام بطيء بدون فهرس\n $result = mysqli_quer