بسم الله الرحمن الرحيم
الحمدلله، والصلاة والسلام على خير خلق الله، محمد بن عبدالله، وعلى آله وصحبه الأخيار ومن والاه، أما بعد؛
[ اللهمَّ عَلِّمْنا ما يَنْفَعُنا وانْفَعْنا بِمَا عَلَّمْتَنا وَزِدْنَا عِلْماً يَا رَبَّ الْعَاْلَمِين ]
أحبتي وإخوتي مبرمجي الـ PHP، ألتمس منكم عذراً في بداية حديثي حيث أني لا أكتب الكثير من المواضيع في هذا القسم ، هذا لأن غيري الكثيرين من خبراء سوالف سوفت هم أجدر مني بطرح مواضيعهم البرّاقة، لكن، هذا لا يمنع من أن نتشارك معاً ببعض المعلومات.
كما نعلم جميعاً، أنّ لغة PHP سريعة الأداء في الحقيقة، لكن، ما يحدد سرعة أداء لغة ما، هو كيفية تسخير تلك اللغة في خدمة تطبيقاتنا، وهذا يعتمد بشكل كلي على نمط كتابة الشيفرة من قبل المبرمج.
في هذا الموضوع، وبإذن الله عز وجل، سنتطرق للنقاش حول أساليب رفع الأداء والكفاءة، المطلوب هو نقاش بنّاء لنصل إلى أفضل حلول رفع الأداء أو الـ Optimization في لغة PHP .. سأبدأ في موضوعي هنا بطرح بعض أفكار وتلميحات تحسين الأداء، ومن ثم أنتظر مشاركاتكم، تعليقاتكم، وإضافاتكم إن شاء الله تعالى ..
أولاً: استخدام الثوابت غير المعرّفة:
الثابت ببساطة هو مساحة من الذاكرة تخصص لتخزين بيانات معينة لا تتغير في أثناء التنفيذ، مثال لتعيين ثابت:
كود PHP:
define('MYCONST', 'value');
عند استخدام الثابت هذا:
سيتم تنفيذ الجملة بشكل سريع نظراً لتعريف الثابت المسبق، ماذا لو استخدمنا العبارة البرمجية الثانية دون سطر define الأول ؟!
عندها سيعمل المترجم على البحث تلقائياً على ثابت تحت مسمى MYCONST ، وعندما لا يجده سيسلّم واقع أمره ويعيد قيمة نصية بنفس اسم الثابت المفقود MYCONST ، هذا يعني أن النتيجة ستكون "MYCONST" ..
الاستخدام الشائع جداً لهذا الخطأ يتمثل في هذا النمط في استخدام المصفوفات:
إن استخدام المفتاح key دون علامات تنصيص سيجعل المترجم يعتبره ثابتاً، ثم يبحث عن ثابت باسم key ليعيد قيمته ويعوّضها بدلاً من اسم الثابت في السطر البرمجي السابق ..
ماذا لو كان الثابت key معرّف فعلاً في بداية الملف؟ عندها سـ " تخرب الطبخة " .. لأن قيمة الثابت ستحل بدلاً من اسمه في السطر السابق .. عموماً عملية البحث عن الثابت وعدم إيجاده ثم إعادة نص باسم الثابت المفقود وإرسال خطأ من نوع ملاحظة Notice ، سيكلّف سيرفرك مزيداً من الوقت في التنفيذ ، وسيعيق أداء برنامجك بعض الشيء ...
الاستخدام الصحيح هو:
كود PHP:
$array['key'];
$array["key"];
ثانياً: استخدام الدوال في الحلقات:
عند استخدام تركيب for لتنفيذ حلقة معينة، لنفرض أننا نريد تنفيذ حلقة طالما العداد أقل من عدد حروف متغير معين:
كود PHP:
for ($i = 0; $i < strlen($str); $i++) {
}
هذا هو الأسلوب الذي اعتاد عليه مبرمجونا، لكن، ما المشكلة في هذا النمط؟
حلقة for تقوم باستدعاء دالة strlen في كل مرة تتكرر فيها الحلقة، لنفرض أن المتغير طوله 1000 بايت، هل ترضى أن يتم استدعاء دالة strlen لـ 1000 مرة فقط لإنجاز مهمة بسيطة ؟
لنصحح هذا الخطأ الأدائئ بإنشاء متغير قبل الحلقة نضع فيه عدد الحروف الناتج عن دالة strlen، نعم يبدو لك أننا حجزنا متغيراً إضافياً واستهلكنا جزءاً من الذاكرة، لكن [ رب ضارة نافعة ] ، سنحجز هذا المتغير ونتوكل على الله
..
كود PHP:
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
}
يمكننا كذلك إدخاله كجزء من الحلقة:
كود PHP:
for ($i = 0, $len = strlen($str); $i < $len; $i++) {
}
فكل الطرق تؤدي إلى بغداد ... 
ثالثاً: إخفاء الأخطاء بـ @ :
حتى لا تحاول إخفاء أخطاءك البرمجية التي قد تضع مئات الناس في دوامات المشاكل المتتابعة جرّاء استخدام "سكربتك" عزيزي المبرمج، كان الأجدر بمعامل إخفاء الأخطاء ( @ ) أن يكون بطيئاً
..
خلال سير برنامجك، وحتى تتجنب استخدام معامل @ ، حاول أن تفترض جميع الحلول المناسبة، وجميع الأخطاء التي قد يقع مستخدمو برمجيتك المتواضعة فيها ..
فمثلاً، عندما نقوم بقسمة متغير على آخر :
فإنه من المحتمل أن يكون المتغير y$ يساوي صفراً ، وعندها تؤول حالتنا إلى خطأ القسمة على صفر .. لأن القيمة العددية المقسومة على صفر هي عدد غير حقيقي << دخلنا في الرياضيات
..
كونك مبرمجاً، عليك أن تراعي الشعور السيء الذي يعترض المستخدم عندما يرى رسالة الخطأ، وعليك أن تدرس جميع احتمالات الأخطاء وتتجنبها :
كود PHP:
if (intval($y) == 0) {
echo 'لا يمكن أن يكون المقسوم عليه صفراً';
}
بهذه الطريقة، سنحاكي عقلية المستخدم وتجنب أخطاءه بدلاً من استخدام معامل الغباء، معامل "@"، طبعاً سيشعرنا هذا المعامل بالغباء طالما اعتمدنا عليه في " إخفاء أخطائنا أمام الناس " ..
رابعاً: بديل الاستعلام الشرطي عن طول النص:
عزيزي المستمع، انظر هنا:
كود PHP:
if (strlen($str) < 7) {
}
هذه الجملة تخبرنا أنه إذا كان المتغير يقصر عن 7 حروف، فسيتم تنفيذ الشرط ..
استخدام isset مع محددة موقع الحرف ستكون أسرع لأنها تراكيب لغوية فضلاً عن استخدام دالة تستغرق وقتاً أطول:
كود PHP:
if (!isset($str[6])) {
}
فقط هذا
..
خامساً: علامات التنصيص المفردة أسرع من علامات التنصيص المزدوجة:
ليست بالفعل معلومة جديدة، عليك عزيزي المبرمج أن تستخدم علامات التنصيص المفردة في الأماكن التي لا تحتاج فيها تلك العلامات المزدوجة .. مع محاولة تفضيل المفردة دائماً .. 
وأخيراً وليس آخراً:
نظراً لضيق وقتي الشديد، هذا تضمّن تراجع قدرتي على كتابة المشاركات من مواضيع وردود، لذلك أخذت باختصار ما أردت ذكره ، وأوردت جملة من خمس نقاط رغم أن تحسين الأداء لا يكفيه مئات السطور، لذا، فإن الهدف من الموضوع مشاركة المعلومات بين الجميع .. 
أعتذر لتقصيري ، سواء في أسلوبي أو في المعلومات وهذا يعود لنفس السبب أعلاه ..
[ بانتظار مداخلاتكم ]
أرق التحيات، أشرف السمهوري