صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 27

الموضوع: PHP وتحسين الأداء، لكل داء دواء ..

  1. #1
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647

    PHP وتحسين الأداء، لكل داء دواء ..



    بسم الله الرحمن الرحيم

    الحمدلله، والصلاة والسلام على خير خلق الله، محمد بن عبدالله، وعلى آله وصحبه الأخيار ومن والاه، أما بعد؛

    [ اللهمَّ عَلِّمْنا ما يَنْفَعُنا وانْفَعْنا بِمَا عَلَّمْتَنا وَزِدْنَا عِلْماً يَا رَبَّ الْعَاْلَمِين ]

    أحبتي وإخوتي مبرمجي الـ PHP، ألتمس منكم عذراً في بداية حديثي حيث أني لا أكتب الكثير من المواضيع في هذا القسم ، هذا لأن غيري الكثيرين من خبراء سوالف سوفت هم أجدر مني بطرح مواضيعهم البرّاقة، لكن، هذا لا يمنع من أن نتشارك معاً ببعض المعلومات.

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

    في هذا الموضوع، وبإذن الله عز وجل، سنتطرق للنقاش حول أساليب رفع الأداء والكفاءة، المطلوب هو نقاش بنّاء لنصل إلى أفضل حلول رفع الأداء أو الـ Optimization في لغة PHP .. سأبدأ في موضوعي هنا بطرح بعض أفكار وتلميحات تحسين الأداء، ومن ثم أنتظر مشاركاتكم، تعليقاتكم، وإضافاتكم إن شاء الله تعالى ..

    أولاً: استخدام الثوابت غير المعرّفة:

    الثابت ببساطة هو مساحة من الذاكرة تخصص لتخزين بيانات معينة لا تتغير في أثناء التنفيذ، مثال لتعيين ثابت:
    كود PHP:
    define('MYCONST''value'); 
    عند استخدام الثابت هذا:
    كود PHP:
    echo MYCONST
    سيتم تنفيذ الجملة بشكل سريع نظراً لتعريف الثابت المسبق، ماذا لو استخدمنا العبارة البرمجية الثانية دون سطر define الأول ؟!

    عندها سيعمل المترجم على البحث تلقائياً على ثابت تحت مسمى MYCONST ، وعندما لا يجده سيسلّم واقع أمره ويعيد قيمة نصية بنفس اسم الثابت المفقود MYCONST ، هذا يعني أن النتيجة ستكون "MYCONST" ..

    الاستخدام الشائع جداً لهذا الخطأ يتمثل في هذا النمط في استخدام المصفوفات:
    كود PHP:
    $array[key]; 
    إن استخدام المفتاح 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++) {


    فكل الطرق تؤدي إلى بغداد ...

    ثالثاً: إخفاء الأخطاء بـ @ :

    حتى لا تحاول إخفاء أخطاءك البرمجية التي قد تضع مئات الناس في دوامات المشاكل المتتابعة جرّاء استخدام "سكربتك" عزيزي المبرمج، كان الأجدر بمعامل إخفاء الأخطاء ( @ ) أن يكون بطيئاً ..

    خلال سير برنامجك، وحتى تتجنب استخدام معامل @ ، حاول أن تفترض جميع الحلول المناسبة، وجميع الأخطاء التي قد يقع مستخدمو برمجيتك المتواضعة فيها ..

    فمثلاً، عندما نقوم بقسمة متغير على آخر :
    كود PHP:
    $i $x $y
    فإنه من المحتمل أن يكون المتغير y$ يساوي صفراً ، وعندها تؤول حالتنا إلى خطأ القسمة على صفر .. لأن القيمة العددية المقسومة على صفر هي عدد غير حقيقي << دخلنا في الرياضيات ..

    كونك مبرمجاً، عليك أن تراعي الشعور السيء الذي يعترض المستخدم عندما يرى رسالة الخطأ، وعليك أن تدرس جميع احتمالات الأخطاء وتتجنبها :
    كود PHP:
    if (intval($y) == 0) {
        echo 
    'لا يمكن أن يكون المقسوم عليه صفراً';

    بهذه الطريقة، سنحاكي عقلية المستخدم وتجنب أخطاءه بدلاً من استخدام معامل الغباء، معامل "@"، طبعاً سيشعرنا هذا المعامل بالغباء طالما اعتمدنا عليه في " إخفاء أخطائنا أمام الناس " ..

    رابعاً: بديل الاستعلام الشرطي عن طول النص:

    عزيزي المستمع، انظر هنا:
    كود PHP:
    if (strlen($str) < 7) {


    هذه الجملة تخبرنا أنه إذا كان المتغير يقصر عن 7 حروف، فسيتم تنفيذ الشرط ..

    استخدام isset مع محددة موقع الحرف ستكون أسرع لأنها تراكيب لغوية فضلاً عن استخدام دالة تستغرق وقتاً أطول:
    كود PHP:
    if (!isset($str[6])) {


    فقط هذا ..

    خامساً: علامات التنصيص المفردة أسرع من علامات التنصيص المزدوجة:

    ليست بالفعل معلومة جديدة، عليك عزيزي المبرمج أن تستخدم علامات التنصيص المفردة في الأماكن التي لا تحتاج فيها تلك العلامات المزدوجة .. مع محاولة تفضيل المفردة دائماً ..

    وأخيراً وليس آخراً:

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

    أعتذر لتقصيري ، سواء في أسلوبي أو في المعلومات وهذا يعود لنفس السبب أعلاه ..

    [ بانتظار مداخلاتكم ]

    أرق التحيات، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!


  2. #2
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    32


    كونك مبرمجاً، عليك أن تراعي الشعور السيء الذي يعترض المستخدم عندما يرى رسالة الخطأ، وعليك أن تدرس جميع احتمالات الأخطاء وتتجنبها

    بحق جملة جداً رائعة يجب التقيد بها

    أتمنى ان تكون هذه بداية سلسلة تضم عدد اكبر من هذه الادوية

    أشكرك جزيل الشكر






  3. #3
    عضو نشيط جدا
    تاريخ التسجيل
    Oct 2003
    المشاركات
    549


    مشكور على الموضوع الرائع

    ولا اخفيك سراً اني كنت انوي كتابة موضوع يتحدث عن نفس فكرة موضوعك

    واسمح لي ان اضيف ملاحظة إضافية للموضوع وستكون لي رجعة اخرى مع الموضوع

    استخدام str_replace اسرع من perg_replace إذا كنت لا تريد استخدام التعابير القياسية





    __________________
    صالح المطرفي (Mr.Saphpـ)
    مدونتــــــي
    الصندوق الماسي الخامس
    قوالب WordPress
    تم بحمد الله الإنتهاء من سكربت الدروس العربي 4.0
    http://www.saphplesson.org

  4. #4
    عضو فعال
    تاريخ التسجيل
    Aug 2007
    المشاركات
    1,431


    ماشاء الله اخوي أشرف درس ولا أروع :nice:

    لكن عندي كم سؤال :1power:
    - هل الشروط "if + else + esleif" تسبب بطئ ؟.
    - هل unset و mysql_free_result تفيدان بالتسريع ؟ .



    وشكراً على الموضوع الأكثر من رائع :app:.






  5. #5


    جزاك الله خيراً أخي
    درس مفيد





    __________________
    السيف أصدق أنباء من الكتب

  6. #6
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    موضوع جميل وطرق مفيدة لتحسين الأداء ، أعجبتني الطريقة التي قمت فيها بإستخدام الدالة isset للعنصر السادس من المتغير بدلاً من إستخادم الدالة strlen ، عموماً أنت لم تتطرق للتعامل مع قواعد البيانات وبالأخص mysql وطرق تحسين الأداء فيها ، مبدأياً .. إستخدام الدالة mysql_free_result بعد الإنتهاء من الإستعلام سيكون مفيداً بشكلٍ كبير في هذا المجال ، شكراً لك أستاذ أشرف السمهوري ..






  7. #7
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2007
    المشاركات
    597


    شكرا لك على الدرس الجميل

    ولقد استفدت منه كثير






  8. #8
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    درس جيد ومهم
    شكراً لك اخي الكريم
    بخصوص نصيحة الأخ Mr.Saphp لقد سمعت انه بالعكس perg_replace اسرع بكثير جدا من str_replace
    فأيهما أسرع؟؟





    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  9. #9
    عضو نشيط جدا
    تاريخ التسجيل
    Sep 2006
    المشاركات
    547


    على الإطلاق، فالتابع str_replace أسرع بكثير من preg_replace وهذا عن تجربة فعلية في مشروع ar-php.org حيث أجريت التجربة باستخدام Apache ab، لذا يفضل إستخدامه كلما كان ذلك ممكنا، لكن وكما هو معلوم هناك حالات يصعب فيها استبدال التعابير النظامية المعقدة والمرنة بتعليمات استبدال بسيطة






  10. #10
    عضو نشيط جدا
    تاريخ التسجيل
    Sep 2006
    المشاركات
    547


    فيما يخص الثوابت مثل الرسائل النصية في تطبيق ما، صحيح أن استخدام define أسرع من استخدام المتحولات، لكني وجدت حل أفضل وأسرع من ذلك خلال عملي على تطوير إضافة plugin لمدونة Wordpress في إطار مشروع PHP واللغة العربية، حيث يستخدمون مكتبة GNU GetText التي أنصح المحترفين من المبرمجين الإطلاع عليها واستخدامها






  11. #11
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    على الإطلاق، فالتابع str_replace أسرع بكثير من preg_replace وهذا عن تجربة فعلية في مشروع ar-php.org حيث أجريت التجربة باستخدام Apache ab، لذا يفضل إستخدامه كلما كان ذلك ممكنا، لكن وكما هو معلوم هناك حالات يصعب فيها استبدال التعابير النظامية المعقدة والمرنة بتعليمات استبدال بسيطة
    جزاك الله خيرا على الافادة
    لكن طالما الأمر هكذا ما الداعي لارهاق النفس في عمل تعبيرات قياسية باستخدام preg_replace
    فالاسهل طبعا استخدام str_replace لانها لا تستخدم التعبيرات القياسية





    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  12. #12
    عضو نشيط
    تاريخ التسجيل
    Feb 2008
    المشاركات
    281


    السلام عليكم ورحمة اللة وبركاتة

    وكل عام وأنتم بخير

    موضوع رائع يا استاذ أشرف أشرف السمهوري

    ممكن تخبرنى يا أستاذ خالد هل Apache ab يقوم بأختبار سرعة البرنامج

    وياريت تدلنى على أى اداة تقوم بأختابر البرنامج هلى يعمل لود ام المعدل طبيعى هل يعمل حمل على mysql ام المعدل طبيعى

    وشكرآ لكم






  13. #13
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    كونك مبرمجاً، عليك أن تراعي الشعور السيء الذي يعترض المستخدم عندما يرى رسالة الخطأ، وعليك أن تدرس جميع احتمالات الأخطاء وتتجنبها

    بحق جملة جداً رائعة يجب التقيد بها

    أتمنى ان تكون هذه بداية سلسلة تضم عدد اكبر من هذه الادوية

    أشكرك جزيل الشكر
    أهلاً بمرورك، ستكون بإذن الله تعالى ..

    مشكور على الموضوع الرائع

    ولا اخفيك سراً اني كنت انوي كتابة موضوع يتحدث عن نفس فكرة موضوعك

    واسمح لي ان اضيف ملاحظة إضافية للموضوع وستكون لي رجعة اخرى مع الموضوع

    استخدام str_replace اسرع من perg_replace إذا كنت لا تريد استخدام التعابير القياسية
    وهو كذلك، str_replace أسرع من preg_replace بـ 2.5 مرة تقريباً ، لكن الحاجة إلى preg_replace أحياناً قد لا تمكننا من استخدام str_replace ، على أية حال، فإن preg_replace أسرع من ereg_replace والتي سوف لن تعود جزءاً من توزيعة PHP 6 الرسمية ..

    شكراً لإضافتك عزيزي ..

    ماشاء الله اخوي أشرف درس ولا أروع

    لكن عندي كم سؤال
    - هل الشروط "if + else + esleif" تسبب بطئ ؟.
    - هل unset و mysql_free_result تفيدان بالتسريع ؟ .



    وشكراً على الموضوع الأكثر من رائع .
    أهلاً عزيزي ، شكراً لإطرائك أولاً ..

    ثم، بخصوص If ، فهي جملة الشرط التي تعتمد عليها كل السكربتات الكبيرة ..

    إذا أتينا لها من ناحية الأداء، فهي سريعة بالشكل الكافي، لكن عند مقارنتها بجملة الاختيار switch، سنجد أن بنية switch أسرع من if بـ 1.2 مرة ..

    هذا لا يشير إطلاقاً على بطء جملة If ، لكنه يدل على سرعة جملة switch ..

    مهلاً، لست مضطراً إلى استبدال جمل If بـ Switch، فقط تمهّل في كتابة الشروط قد تجد حلولاً لاختصار الكثير من الشروط الفائضة ..

    كما وأود الإشارة إلى نقطة هامة جداً في جمل الشرط، وهو اختيار المعامل المناسب، فعندما تقوم بمقارنة integer مع integer ( أي عدد صحيح مع عدد صحيح ) لا تستخدم المعامل == ، حيث أنه بذلك سيتأكد من نوع البيانات أولاً ثم يحوّلها ثم يقارن ، إذاً، استخدم === ( مع التأكد من نوع البيانات دائماً ) ..

    أي أن المسألة نسبية تعتمد على فهمك لأصول اللغة .. ( في تجربة سريعة كانت المقارنة بالمعامل === أسرع من == بـ 1.45 مرة تقريباً، هذا لن يؤثر كثيراً على موقع متواضع أو على عملية واحدة كل فترة معينة، لكن، كي تصل إلى مستوى أرقى في جودة وأداء برامجك عليك أن تلتزم بهذه النقاط ..

    جزاك الله خيراً أخي
    درس مفيد
    وإياك عزيزي، ننتظر إضافاتك حالما ترغب بنشرها ..

    درس جيد ومهم
    شكراً لك اخي الكريم
    بخصوص نصيحة الأخ Mr.Saphp لقد سمعت انه بالعكس perg_replace اسرع بكثير جدا من str_replace
    فأيهما أسرع؟؟
    العفو وشكراً لمرورك ..

    على الإطلاق، فالتابع str_replace أسرع بكثير من preg_replace وهذا عن تجربة فعلية في مشروع ar-php.org حيث أجريت التجربة باستخدام Apache ab، لذا يفضل إستخدامه كلما كان ذلك ممكنا، لكن وكما هو معلوم هناك حالات يصعب فيها استبدال التعابير النظامية المعقدة والمرنة بتعليمات استبدال بسيطة
    فيما يخص الثوابت مثل الرسائل النصية في تطبيق ما، صحيح أن استخدام define أسرع من استخدام المتحولات، لكني وجدت حل أفضل وأسرع من ذلك خلال عملي على تطوير إضافة plugin لمدونة Wordpress في إطار مشروع PHP واللغة العربية، حيث يستخدمون مكتبة GNU GetText التي أنصح المحترفين من المبرمجين الإطلاع عليها واستخدامها
    جزيت خيراً أستاذنا لتوضيحك وقد وضّحت المزيد بخصوص هذا الموضوع في ردي هذا ..

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

    جزاك الله خيرا على الافادة
    لكن طالما الأمر هكذا ما الداعي لارهاق النفس في عمل تعبيرات قياسية باستخدام preg_replace
    فالاسهل طبعا استخدام str_replace لانها لا تستخدم التعبيرات القياسية
    هناك تعبيرات قياسية لا يمكن الاستغناء عنها بسهولة .. ابحث في سوالف عن مواضيع تتحدث عن التعابير وستشاهد القدرات الهائلة لها ..

    وختاماً، نقاش جميل، هذا ما أردته من الموضوع، أتمنى الاستمرار في النقاش وطرح المزيد من الأفكار لنتحدث حولها ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  14. #14
    عضو جديد
    تاريخ التسجيل
    Apr 2008
    المشاركات
    27


    مبدع أستاذي أشرف ..ومنكم نستفيد تابع سلسلتك فأنا بالقرب






  15. #15
    عضو نشيط جدا
    تاريخ التسجيل
    Sep 2006
    المشاركات
    547


    أخي العزيز، إن برمجية Apache ab التي تأتي مع مخدم Apache سهلة الإستخدام جدا من سطر الأوامر، وقادرة على فحص أداء برمجيات الويب تحت الضغط وتولد تقريرا إحصائيا حول الإختبار










ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض