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

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

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

ابدأ الدورة

مقدمة: لماذا السرعة مهمة؟



تخيل أن موقعك يستغرق أكثر من 3 ثوانٍ للتحميل. وفقًا لـ Google، سيهجر 53% من المستخدمين الموقع، وستنخفض نسبة التحويل بنسبة 20%. بالنسبة لمطور PHP، فإن القدرة على تحسين التطبيق ليست مجرد "أخلاق حميدة"، بل ضرورة. حتى لو كنت في بداية مسيرتك، فإن التقنيات الأساسية لتسريع الكود ستساعدك على إنشاء مشاريع سريعة وسريعة الاستجابة.



في هذه المقالة، سنستعرض 4 اتجاهات رئيسية: من التخزين المؤقت والعمل مع قواعد البيانات إلى إعداد الخادم والتنميط. ستحصل على أمثلة جاهزة للكود وقائمة مراجعة للتنفيذ.



1. التخزين المؤقت: نحفظ النتيجة بدلاً من إعادة الحساب



التخزين المؤقت يشبه كتابة ورقة غش قبل الامتحان. بدلاً من إعادة حساب البيانات المعقدة في كل مرة، نقوم بحفظها في مخزن سريع.



1.1. التخزين المؤقت في الذاكرة (Memcached / Redis)

بالنسبة للبيانات التي نادرًا ما تتغير (مثل قائمة الفئات أو الإعدادات)، فإن التخزين المؤقت في الذاكرة العشوائية (RAM) مثالي.



<?php// مثال مع Memcached$memcached = new Memcached();$memcached->addServer('localhost', 11211);

$key = 'categories_list';$categories = $memcached->get($key);

if ($categories === false) { // البيانات غير موجودة في الذاكرة المؤقتة - نحصل عليها من قاعدة البيانات $categories = $db->query("SELECT * FROM categories")->fetchAll(); // نحفظ لمدة ساعة واحدة (3600 ثانية) $memcached->set($key, $categories, 3600);}

// نستخدم $categoriesforeach ($categories as $cat) { echo $cat['name'];}?>


1.2. التخزين المؤقت لأجزاء HTML (Output Buffer)

إذا كان لديك كتل ثقيلة (أدوات، قوائم)، قم بتخزين HTML الجاهز مؤقتًا.



<?phpfunction getCachedWidget($widgetName, $ttl = 300) {    $cacheFile = __DIR__ . '/cache/' . md5($widgetName) . '.html';        if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $ttl) {        return file_get_contents($cacheFile);    }        ob_start();    // هنا الكود الذي يولد الأداة    echo "<div class='widget'>محتوى معقد...</div>";        $html = ob_get_clean();    file_put_contents($cacheFile, $html);        return $html;}

echo getCachedWidget('sidebar_menu');?>


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



أكثر نقطة اختناق في تطبيقات PHP هي قاعدة البيانات. استعلام واحد سيء يمكن أن "يقتل" أداء الموقع بأكمله.



2.1. استخدم الفهارس (Indexes)

بدون فهرس، يضطر MySQL إلى مسح الجدول بأكمله. أضف فهارس على الحقول التي تشارك في WHERE و JOIN و ORDER BY.



-- سيء: مسح كاملSELECT * FROM users WHERE email = 'test@test.com';

-- جيد: استخدام الفهرسCREATE INDEX idx_email ON users(email);SELECT * FROM users WHERE email = 'test@test.com';


2.2. تجنب استعلامات N+1

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



<?php// سيء: استعلامات N+1$users = $db->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) {    $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);    // ...}

// جيد: استعلام واحد مع JOIN$users = $db->query(" SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id")->fetchAll();?>


2.3. التحميل البطيء (Lazy Loading)

لا تقم بتحميل البيانات التي لا تحتاجها الآن. استخدم التقسيم إلى صفحات (Pagination) أو LIMIT.



// بدلاً من:$all = $db->query("SELECT * FROM logs"); // 100,000 صف

// استخدم:$page = $_GET['page'] ?? 1;$limit = 20;$offset = ($page - 1) * $limit;$logs = $db->query("SELECT * FROM logs LIMIT $limit OFFSET $offset");


3. إعداد الخادم و OPcache



أحيانًا المشكلة ليست في الكود، بل في تكوين PHP. أقوى تحسين هو

المدونات

توصيات الكتب