أداء PHP: كيفية تحليل وتسريع الكود بمقدار 10 مرات

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

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

ابدأ الدورة

موقع PHP الخاص بك بطيء؟ حان الوقت للنظر تحت الغطاء

\n\n

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

\n\n

سنتحدث عن أداء PHP — من القياسات البسيطة إلى التحليل العميق. ستتعلم كيفية استخدام Xdebug و Blackfire للعثور على الأجزاء الإشكالية، وأي طرق التحسين تعمل حقًا. هيا بنا!

\n\n

الخطوة 1. قياس كل شيء: من الميكروثانية إلى الميغابايت

\n\n

قبل تحسين أي شيء، تحتاج إلى فهم أين يحدث البطء. الحدس غالبًا ما يخدع. دعنا نستخدم الأدوات.

\n\n

أبسط طريقة: microtime(true)

\n\n

للتحقق السريع من جزء من الكود، يمكن استخدام microtime() القديم الجيد. ليس أنيقًا، لكنه يعمل.

\n\n
<?php\n$start = microtime(true);\n\n// الكود البطيء الخاص بك\n$data = [];\nfor ($i = 0; $i < 100000; $i++) {\n    $data[] = md5($i . 'salt');\n}\n\n$end = microtime(true);\necho 'وقت التنفيذ: ' . round(($end - $start) * 1000, 2) . ' مللي ثانية';\n?>
\n\n

هذه الطريقة جيدة للتقييم التقريبي. لكن عندما يكبر المشروع، تحتاج إلى أدوات جادة.

\n\n

Xdebug — محققك الشخصي

\n\n

Xdebug هو المعيار الفعلي لـ تحليل PHP. يقوم بإنشاء ملفات cachegrind التي يمكن فتحها في KCachegrind (لينكس) أو QCachegrind (ماك/ويندوز).

\n\n

التثبيت عبر pecl:

\n
pecl install xdebug
\n\n

لنقم بتفعيل التحليل في php.ini:

\n
xdebug.mode = profile\nxdebug.output_dir = /tmp/profiling
\n\n

بعد تنفيذ السكريبت، سيظهر ملف في المجلد. افتحه في QCachegrind — سترى أي دالة استهلكت أكبر وقت. غالبًا ما تكون المفاجأة: ليست قاعدة البيانات، بل معالجة بسيطة للنصوص في حلقة.

\n\n

Blackfire — لمن يحبون لوحات المعلومات الجميلة

\n\n

Blackfire من SensioLabs (مبتكري Symfony) هو محلل سحابي. لا يظهر الوقت فقط، بل أيضًا عدد الاستدعاءات، الذاكرة، الإدخال/الإخراج. يتكامل مع PHPUnit، Symfony، Laravel.

\n\n

مثال للاستخدام من سطر الأوامر:

\n
blackfire run php myscript.php
\n\n

ستحصل على رابط لتقرير ويب مع تصور. مناسب للبحث عن نقاط اختناق أداء PHP.

\n\n

الخطوة 2. المشاكل النموذجية وحلولها

\n\n

الآن بعد أن تعلمنا التحليل، دعنا نناقش المشاكل الشائعة.

\n\n

المشكلة 1: استعلامات N+1 في الحلقة

\n\n

كلاسيكي. تحصل على قائمة المستخدمين، ثم في حلقة تقوم باستعلام لقاعدة البيانات لكل مستخدم.

\n\n

الكود البطيء:

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\nforeach ($users as $user) {\n    $orders = $db->query("SELECT * FROM orders WHERE user_id = {$user['id']}");\n    // ...\n}\n?>
\n\n

التحسين:

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\n$ids = array_column($users, 'id');\n$orders = $db->query('SELECT * FROM orders WHERE user_id IN (' . implode(',', $ids) . ')');\n// تجميع حسب user_id\n$grouped = [];\nforeach ($orders as $order) {\n    $grouped[$order['user_id']][] = $order;\n}\n?>
\n\n

النتيجة: 100 استعلام تحولت إلى 2. أداء تطبيق PHP يزيد أضعافًا.

\n\n

المشكلة 2: الحلقات غير الفعالة والتعامل مع النصوص

\n\n

دمج النصوص في حلقة هو شر. استخدم المصفوفات و implode().

\n\n
<?php\n// سيء\n$result = '';\nfor ($i = 0; $i < 10000; $i++) {\n    $result .= 'item' . $i . ',';\n}\n\n// جيد\n$parts = [];\nfor ($i =                

المدونات

توصيات الكتب