تحليل أداء كود PHP: اكتشاف نقاط الضعف وتسريع الموقع

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا كود PHP الخاص بك بطيء؟

واجه كل مطور موقفًا يبدأ فيه موقع PHP بالتباطؤ. تستغرق الصفحات من 5 إلى 10 ثوانٍ للتحميل، وتتعطل قاعدة البيانات، ويختنق الخادم تحت الحمل. غالبًا ما تكمن المشكلة ليس في العتاد، بل في الكود — فيما يسمى "الاختناقات" (bottlenecks).

التنميط (Profiling) هو عملية جمع بيانات حول مقدار الوقت والذاكرة الذي يستهلكه كل جزء من السكريبت الخاص بك. بدون التنميط، أنت تعمل بشكل أعمى، وتخمن ما الذي يبطئ التطبيق. في هذه المقالة، سنشرح كيفية العثور على الاختناقات في كود PHP وإزالتها باستخدام الأدوات الحديثة.



1. أدوات التنميط الأساسية لـ PHP

هناك عدة أدوات موثوقة لتنميط PHP. دعنا نستعرض أشهرها:



1.1. Xdebug — كلاسيكيات التنميط

Xdebug هو إضافة لـ PHP توفر إمكانيات قوية لتصحيح الأخطاء والتنميط. يقوم بإنشاء ملفات تتبع يمكن تحليلها في أدوات مساعدة خاصة (مثل KCacheGrind أو Webgrind).

تثبيت Xdebug (Ubuntu/Debian):

sudo apt install php-xdebugsudo phpenmod xdebug

الإعداد في php.ini:

xdebug.mode = profilexdebug.output_dir = /tmp/profilingxdebug.profiler_output_name = cachegrind.out.%t.%p

بعد ذلك، سيقوم كل طلب بإنشاء ملف تنميط في المجلد /tmp/profiling. يمكن فتحه في KCacheGrind (لينكس) أو QCacheGrind (ويندوز/ماك).



1.2. Blackfire.io — أداة التنميط السحابية

Blackfire هي خدمة تجارية من SensioLabs (مبتكري Symfony). تقدم واجهة ويب مريحة، وتكامل مع CI/CD، وتوصيات تلقائية للتحسين.

التثبيت عبر Composer:

composer require blackfire/php-sdk

مثال على الاستخدام في الكود:

<?php$probe = Blackfire::createProbe();// كودك$probe->close();?>

يظهر Blackfire ليس فقط وقت التنفيذ، بل أيضًا عدد استعلامات SQL، واستدعاءات الدوال، واستهلاك الذاكرة. مثالي للمشاريع الكبيرة.



1.3. دوال PHP المدمجة

للتشخيص السريع، يمكن استخدام الدوال المدمجة:

  • microtime(true) — قياس وقت تنفيذ جزء من الكود.
  • memory_get_usage() — استهلاك الذاكرة الحالي.
  • memory_get_peak_usage() — ذروة استهلاك الذاكرة.

مثال:

<?php$start = microtime(true);// كودك$time = microtime(true) - $start;echo "تم التنفيذ خلال: " . round($time, 4) . " ثانية";?>


2. الاختناقات النموذجية في كود PHP

بعد إعداد أداة التنميط، حان الوقت لفهم ما يجب الانتباه إليه. إليك أكثر المشاكل شيوعًا:



2.1. استعلامات N+1 لقاعدة البيانات

هذه كلاسيكية: يتم جلب البيانات المرتبطة باستعلامات منفصلة داخل حلقة. مثال على كود سيء:

<?php$users = $db->query("SELECT * FROM users");foreach ($users as $user) {    $posts = $db->query("SELECT * FROM posts WHERE user_id = {$user['id']}");    // معالجة...}?>

الحل: استعلام واحد مع JOIN:

<?php$data = $db->query("SELECT u.*, p.* FROM users u LEFT JOIN posts p ON u.id = p.user_id");?>


2.2. الحلقات غير المثلى

الحلقات المتداخلة مع مصفوفات كبيرة هي قاتلة الأداء. مثال:

<?phpforeach ($bigArray as $outer) {    foreach ($bigArray as $inner) {        // تعقيد O(n²)    }}?>

استخدم جداول التجزئة (المصفوفات الترابطية) لتسريع البحث:

<?php$map = [];foreach ($bigArray as $item) {    $map[$item['id']] = $item;}?>


2.3. الاستخدام المفرط للتحميل التلقائي للكلاسات

المدونات

توصيات الكتب