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

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

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

ابدأ الدورة

مقدمة



لا تزال PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب: فهي تشغل WordPress و Laravel و Symfony وملايين المواقع. ومع ذلك، مع زيادة الحمل، يمكن أن يصبح أداء تطبيقات PHP عنق الزجاجة. لا يؤدي بطء تحميل الصفحات إلى تدهور تجربة المستخدم فحسب، بل يقلل أيضًا من ترتيب محركات البحث (Google تأخذ في الاعتبار Core Web Vitals).



في هذه المقالة، سنستعرض طرق تحسين PHP المُثبتة التي ستساعد في تسريع تطبيقك دون إعادة كتابة الكود بالكامل. ستتعرف على التخزين المؤقت، وإعداد المفسر، وتحسين قاعدة البيانات، والتنميط.



1. التخزين المؤقت: الخطوة الأولى نحو السرعة



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



1.1. OpCache (PHP 7/8)



PHP هي لغة مُفسرة: في كل طلب، تقوم بتجميع السكريبت إلى opcode (بايت كود). OpCache يحفظ الـ opcode المُجمّع في الذاكرة العشوائية (RAM)، مما يمنع إعادة التجميع. هذا يعطي زيادة في الأداء تصل إلى 30-50%.



كيفية التفعيل: افتح php.ini وتأكد من ضبط المعاملات:



opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=2


لبيئة الإنتاج، قم بتعيين opcache.revalidate_freq=0 وقم بمسح ذاكرة التخزين المؤقت يدويًا عند النشر.



1.2. تخزين البيانات مؤقتًا (Redis / Memcached)



إذا كان تطبيقك يقوم باستعلامات مكلفة لقاعدة البيانات أو واجهات برمجة تطبيقات خارجية، استخدم مخازن الذاكرة (in-memory).



مثال مع Redis:



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

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

if (!$profile) { // استعلام مكلف لقاعدة البيانات $profile = getUserProfileFromDB($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // TTL ساعة واحدة}

$profile = unserialize($profile);


1.3. تخزين HTML مؤقتًا (Full Page Cache)



للصفحات الثابتة أو التي نادرًا ما يتم تحديثها (مدونة، صفحة هبوط)، يمكن تخزين مخرجات HTML الجاهزة مؤقتًا. في Laravel يتم ذلك عبر middleware، وفي Symfony عبر HTTP cache.



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



غالبًا ما يكون عنق الزجاجة في تطبيق PHP هو قاعدة البيانات. الاستعلامات البطيئة تستهلك موارد الخادم.



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



تأكد من وجود فهارس على الأعمدة المستخدمة في WHERE و JOIN و ORDER BY. يمكنك التحقق من ذلك عبر EXPLAIN SELECT ....



استعلام سيء (بدون فهرس):



SELECT * FROM orders WHERE status = 'pending';


استعلام جيد (مع فهرس):



CREATE INDEX idx_orders_status ON orders (status);SELECT * FROM orders WHERE status = 'pending';


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



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



المشكلة (Laravel Eloquent):



$users = User::all();foreach ($users as $user) {    echo $user->profile->bio; // استعلام جديد في كل مرة}


الحل (التحميل الجشع):



$users = User::with('profile')->get();foreach ($users as $user) {    echo $user->profile->bio; // استعلام واحد}


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



عند استخدام LIMIT 10 OFFSET 100000، لا يزال MySQL يقوم بفحص 100010 صفًا. استخدم cursor-based pagination (البحث بواسطة الفهرس):



SELECT * FROM posts WHERE id > $lastId ORDER BY id ASC LIMIT 10;


3. تحسين الكود والهندسة المعمارية



حتى مع وجود قاعدة بيانات مثالية وذاكرة تخزين مؤقت، فإن الكود السيء يمكن أن يسبب مشاكل.

المدونات

توصيات الكتب