تحسين أداء تطبيقات PHP: طرق عملية

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

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

ابدأ الدورة

مقدمة: لماذا سرعة تطبيقات PHP حاسمة؟

في الويب الحديث، تؤثر سرعة تحميل الصفحات بشكل مباشر على معدل التحويل، ترتيب SEO وتجربة المستخدم. PHP، باعتبارها لغة خادم، غالباً ما تصبح عنق الزجاجة في الأداء. يعتقد العديد من المطورين أن PHP "بطيئة افتراضياً"، لكن هذا غير صحيح: التحسين الجيد يمكن أن يسرع التطبيق بمقدار 5-10 مرات دون تغيير مجموعة التقنيات. في هذه المقالة، سنستعرض تقنيات عملية ستساعدك على استخراج أقصى استفادة من كود PHP الخاص بك.



1. التنميط: إيجاد نقاط الضعف قبل التحسين

قبل تحسين أي شيء، تحتاج إلى فهم ما الذي يبطئ التطبيق. بدون التنميط، قد تضيع ساعات في "تسريع" أجزاء غير مهمة من الكود، بينما المشكلة الحقيقية تكمن في مكان آخر.



أدوات التنميط

  • Xdebug + KCacheGrind / WebGrind — مجموعة كلاسيكية لتحليل استدعاءات الدوال بالتفصيل.
  • Blackfire.io — أداة تنميط احترافية مع تصورات وتوصيات.
  • مُنمّط PHP المدمج (Tideways, xhprof) — حلول خفيفة الوزن لبيئات الإنتاج.


مثال: قياس وقت التنفيذ الأساسي

<?php$start = microtime(true);

// الكود الخاص بك$data = heavyFunction();

$end = microtime(true);echo 'وقت التنفيذ: ' . round(($end - $start) * 1000, 2) . ' مللي ثانية';?>


نصيحة: استخدم memory_get_usage() و memory_get_peak_usage() لمراقبة استهلاك الذاكرة. غالباً ما يكون الكود البطيء هو الكود الذي "يستهلك" كل الذاكرة العشوائية.



2. التخزين المؤقت: الأداة الرئيسية للتسريع

التخزين المؤقت يتجنب إعادة تنفيذ العمليات الثقيلة (استعلامات قاعدة البيانات، عرض القوالب، الحسابات). في PHP، توجد عدة مستويات للتخزين المؤقت.



OPcache: تخزين الكود المترجم مؤقتاً

افتراضياً، يتم ترجمة سكريبت PHP إلى كود تشغيلي مع كل طلب. يحفظ OPcache الكود المترجم في الذاكرة، مما يسرع التنفيذ بنسبة 30-50%.

; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=4000opcache.revalidate_freq=60


تخزين البيانات مؤقتاً باستخدام Redis / Memcached

من الأفضل تخزين استعلامات SQL الثقيلة أو نتائج استدعاءات API في الذاكرة العشوائية.

<?php$cache = new Redis();$cache->connect('127.0.0.1', 6379);

$key = 'user_profile_' . $userId;$profile = $cache->get($key);

if (!$profile) { $profile = $db->query("SELECT * FROM users WHERE id = ?", [$userId])->fetch(); $cache->setex($key, 3600, serialize($profile)); // تخزين مؤقت لمدة ساعة}

$profile = unserialize($profile);?>


تخزين أجزاء HTML مؤقتاً

للصفحات الثابتة أو نادرة التغيير، يمكن تخزين HTML الجاهز مؤقتاً.

<?php$cacheFile = __DIR__ . '/cache/about.html';if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) {    readfile($cacheFile);    exit;}

ob_start();// ... عرض الصفحة ...$html = ob_get_clean();file_put_contents($cacheFile, $html);echo $html;?>


3. تحسين العمل مع قاعدة البيانات

قاعدة البيانات هي "المكبح" الأكثر شيوعاً في تطبيقات PHP. حتى كود PHP المكتوب بشكل مثالي يمكن أن يكون بطيئاً بسبب استعلامات غير محسّنة.



القواعد الأساسية

  • الفهارس: أضف فهارس على الحقول المستخدمة في WHERE و JOIN و ORDER BY.
  • مشكلة N+1: استخدم التحميل الجشع (Eager Loading) بدلاً من التحميل الكسول (Lazy Loading).
  • LIMIT و OFFSET: عند التقسيم إلى صفحات، استخدم التقسيم القائم على المؤشر (cursor-based pagination) بدلاً من OFFSET في الجداول الكبيرة.


مثال: تجنب استعلامات N+1

<?php// سيء: استعلامات N+1$users = $db->query("SELECT * FROM users"                

المدونات

توصيات الكتب