مقدمة
\nتطبيق PHP البطيء لا يعني فقط ثوانٍ ضائعة من الانتظار، بل يعني أيضًا مستخدمين محبطين، وانخفاضًا في ترتيب محركات البحث، وزيادة في الحمل على الخادم. لحسن الحظ، حتى المطور المبتدئ يمكنه تحسين أداء الكود الخاص به بشكل كبير دون التعمق في إعدادات النظام المعقدة. في هذه المقالة، سنستعرض طرقًا أساسية لكنها فعالة لتحسين أداء تطبيقات PHP، والتي ستساعد موقعك أو خدمة الويب الخاصة بك على العمل بشكل أسرع وأكثر استقرارًا.
\nسنناقش أربعة مجالات رئيسية: التخزين المؤقت للبيانات، تحسين العمل مع قواعد البيانات، إدارة الذاكرة بشكل صحيح، واستخدام الإمكانيات الحديثة لـ PHP. سيصاحب كل قسم أمثلة عملية للكود.
\n\nالتخزين المؤقت: أداتك الرئيسية للتسريع
\nالتخزين المؤقت هو حفظ نتائج العمليات المكلفة لاستخدامها مرة أخرى. بدلاً من إنشاء الصفحة أو تنفيذ استعلام SQL معقد في كل مرة، يمكنك تقديم نسخة محفوظة مسبقًا.
\n\nالتخزين المؤقت في الذاكرة باستخدام Memcached أو Redis
\nأسرع طريقة للتخزين المؤقت هي استخدام مخازن الذاكرة مثل Memcached أو Redis. فهي تخزن البيانات في ذاكرة الوصول العشوائي (RAM)، مما يسمح بالحصول عليها في أجزاء من المليون من الثانية.
مثال على تخزين مؤقت بسيط لنتيجة استعلام قاعدة بيانات باستخدام Memcached:
<?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.
-- مثال: جدول الطلبات\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+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. استخد