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

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

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

ابدأ الدورة

مقدمة

\n

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

\n

سنناقش أربعة مجالات رئيسية: التخزين المؤقت للبيانات، تحسين العمل مع قواعد البيانات، إدارة الذاكرة بشكل صحيح، واستخدام الإمكانيات الحديثة لـ PHP. سيصاحب كل قسم أمثلة عملية للكود.

\n\n

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

\n

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

\n\n

التخزين المؤقت في الذاكرة باستخدام Memcached أو Redis

\n

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

\n

مثال على تخزين مؤقت بسيط لنتيجة استعلام قاعدة بيانات باستخدام Memcached:

\n
<?php\n$memcached = new Memcached();\n$memcached->addServer('localhost', 11211);\n\n$cacheKey = 'user_profile_123';\n$userData = $memcached->get($cacheKey);\n\nif ($userData === false) {\n    // البيانات غير موجودة في التخزين المؤقت - نقوم بالاستعلام الثقيل\n    $userData = getUserFromDatabase(123);\n    // حفظ في التخزين المؤقت لمدة 10 دقائق (600 ثانية)\n    $memcached->set($cacheKey, $userData, 600);\n}\n\necho $userData['name'];\n?>
\n\n

التخزين المؤقت لصفحات HTML كاملة

\n

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

\n
<?php\n$cacheFile = 'cache/index.html';\n$cacheTime = 3600; // ساعة واحدة\n\nif (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) {\n    // تقديم الصفحة المخزنة مؤقتًا\n    readfile($cacheFile);\n    exit;\n}\n\n// بدء تخزين المخرجات مؤقتًا\nob_start();\n\n// ... كود PHP العادي الخاص بك الذي ينشئ الصفحة ...\n\n$html = ob_get_clean();\nfile_put_contents($cacheFile, $html);\necho $html;\n?>
\n\n

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

\n

قاعدة البيانات هي أكثر عنق الزجاجة شيوعًا في معظم تطبيقات PHP. بعض التغييرات البسيطة يمكن أن تحقق زيادة هائلة في السرعة.

\n\n

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

\n

بدون الفهارس، يقوم MySQL بمسح الجدول بالكامل (full table scan)، وهو أمر بطيء جدًا على كميات كبيرة من البيانات. أضف فهارس على الحقول التي تشارك في شروط WHERE و JOIN و ORDER BY.

\n
-- مثال: جدول الطلبات\nCREATE INDEX idx_user_id ON orders(user_id);\nCREATE INDEX idx_created_at ON orders(created_at);
\n\n

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

\n

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

\n

مثال سيء (N+1):

\n
<?php\n$users = $db->query("SELECT * FROM users");\nforeach ($users as $user) {\n    // لكل مستخدم يتم استعلام منفصل\n    $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);\n}\n?>
\n\n

مثال جيد (استعلام واحد):

\n
<?php\n$usersWithOrders = $db->query("\n    SELECT u.*, o.* \n    FROM users u \n    LEFT JOIN orders o ON u.id = o.user_id\n");\n?>
\n\n

حدد كمية البيانات المسترجعة

\n

لا تطلب أبدًا جميع الصفوف إذا كنت تحتاج فقط إلى 10. استخد

المدونات

توصيات الكتب