تحسين أداء تطبيقات PHP: نصائح وأمثلة

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

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

ابدأ الدورة

مقدمة

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

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



1. التخزين المؤقت للبيانات (Caching)

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



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

استخدم أنظمة التخزين المؤقت في الذاكرة العشوائية (RAM) مثل Redis أو Memcached. إنها مثالية لتخزين نتائج الاستعلامات المعقدة والجلسات (Sessions) والبيانات المطلوبة بشكل متكرر.

<?php// مثال على استخدام Redis للتخزين المؤقت$redis = new Redis();$redis->connect('127.0.0.1', 6379);

$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);

if ($profile === false) { // البيانات غير موجودة في الكاش - نقوم باستعلام ثقيل $profile = getUserProfileFromDatabase($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // كاش لمدة ساعة}

$profile = unserialize($profile);?>


1.2. التخزين المؤقت لمخرجات HTML (Full Page Cache)

للصفحات الثابتة أو الصفحات التي نادرًا ما تتغير، استخدم التخزين المؤقت لـ HTML الجاهز. يمكن تحقيق ذلك باستخدام Varnish أو التخزين المؤقت المدمج في الأطر (Frameworks) الشائعة (مثل Symfony HTTP Cache).



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

غالبًا ما تكون قاعدة البيانات هي عنق الزجاجة (Bottleneck). تحسين الاستعلامات وهيكل قاعدة البيانات يمكن أن يعطي زيادة كبيرة في السرعة.



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

تأكد من أن جميع الأعمدة المشاركة في شروط WHERE و JOIN و ORDER BY تحتوي على فهارس. هذا يسرع البحث بعشرات المرات.



2.2. تحسين الاستعلامات باستخدام EXPLAIN

قبل تنفيذ استعلام معقد، استخدم الأمر EXPLAIN لفهم كيفية تنفيذ MySQL له. ابحث عن "Using filesort" أو "Using temporary" - فهذه علامات على استعلام غير مثالي.

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

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


2.3. التقسيم إلى صفحات (Pagination) بدلاً من LIMIT مع إزاحة كبيرة

استخدام LIMIT مع OFFSET كبير يجبر قاعدة البيانات على مسح العديد من الصفوف. استخدم التقسيم إلى صفحات بناءً على المؤشر (Cursor-based pagination) (WHERE id > last_id).

<?php// سيء: LIMIT 100000, 20$stmt = $db->query("SELECT * FROM articles ORDER BY id LIMIT 100000, 20");

// جيد: التقسيم إلى صفحات بناءً على المؤشر$lastId = $_GET['last_id'] ?? 0;$stmt = $db->query("SELECT * FROM articles WHERE id > $lastId ORDER BY id LIMIT 20");?>


3. استخدام OPcache والتحميل التلقائي للفئات (Autoloading)

PHP هي لغة مفسرة (Interpreted language)، وكل طلب يتطلب ترجمة (Compilation) للنصوص البرمجية. OPcache يحل هذه المشكلة عن طريق حفظ الكود المترجم في الذاكرة.



3.1. إعداد OPcache

تأكد من تمكين OPcache وتكوينه بشكل صحيح. إليك المعلمات المثلى لمعظم المشاريع:

; php.iniopcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=10000opcache.revalidate_freq=2opcache.fast_shutdown=1


3.2. التحميل التلقائي الصحيح للفئات

استخدم Composer للتحميل التلقائي للفئات. هذا يسمح بتحميل الفئات الضرورية فقط

المدونات

توصيات الكتب