من الموقع: STC تطلق خدمةالتلفزيون التفاعلي المطور (انفجن) وتتيحها خلال شهر رمضان المبارك

 

العودة   سوالف سوفت > سوالف برمجة المواقع وتطويرها > PHP
التسجيل المدوّنات البحث مشاركات اليوم جعل الأقسام مقروءة

الرد على الموضوع
 
LinkBack أدوات الموضوع
مشرف قسم PHP
#1  
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
# لا أستخدم ماسنجر أو Facebook ..
# أرسل لي رسالة قصيرة SMS سريعاً: ( رابط ) http://sms.ashraf.ms
( حروف إنجليزية فقط )
أشرف السمهوري is offline   قديم 22-08-2008, 12:55 AM
الرد مع إقتباس
عضو نشيط
#2  

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

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

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

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






Alsharaan is offline   قديم 22-08-2008, 01:40 AM
الرد مع إقتباس
عضو نشيط جدا
#3  

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

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

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

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






__________________
صالح المطرفي (Mr.Saphpـ)
( رابط ) مدونتــــــي 
( رابط ) الصندوق الماسي الخامس 
( رابط ) قوالب WordPress 
تم بحمد الله الإنتهاء من سكربت الدروس العربي 4.0
( رابط ) http://www.saphplesson.org 
Saleh AlMatrafi is offline   قديم 22-08-2008, 02:41 AM
الرد مع إقتباس
عضو فعال
#4  

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

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



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






__________________
- ( رابط موقع مبرّمج .
- ( رابط موقع قالبي . 
Twitter | Flicker
I Love Windows 7
ff5006 is offline   قديم 22-08-2008, 03:10 AM
الرد مع إقتباس
عضو مميز
#5  

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






__________________
( رابط ) برامج 
محب الله ورسوله is offline   قديم 22-08-2008, 03:10 AM
الرد مع إقتباس
عضو سوبر نشيط
#6  

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






dev11 is offline   قديم 22-08-2008, 09:21 AM
الرد مع إقتباس
عضو سوبر نشيط
#7  

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

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






Jo Live is offline   قديم 22-08-2008, 11:47 AM
الرد مع إقتباس
عضو سوبر نشيط
#8  

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






__________________
Islam sharaf
إسلام شرف
مهندس مصرى is offline   قديم 22-08-2008, 01:16 PM
الرد مع إقتباس
عضو نشيط جدا
#9  

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






DNSerror is offline   قديم 22-08-2008, 03:45 PM
الرد مع إقتباس
عضو نشيط جدا
#10  

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






DNSerror is offline   قديم 22-08-2008, 04:02 PM
الرد مع إقتباس
عضو سوبر نشيط
#11  

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






__________________
Islam sharaf
إسلام شرف
مهندس مصرى is offline   قديم 22-08-2008, 04:23 PM
الرد مع إقتباس
عضو نشيط
#12  

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

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

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

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

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

وشكرآ لكم






tech is offline   قديم 22-08-2008, 05:54 PM
الرد مع إقتباس
مشرف قسم PHP
#13  

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

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

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

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

إقتباس:
مشكور على الموضوع الرائع

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

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

استخدام 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
# لا أستخدم ماسنجر أو Facebook ..
# أرسل لي رسالة قصيرة SMS سريعاً: ( رابط ) http://sms.ashraf.ms
( حروف إنجليزية فقط )
أشرف السمهوري is offline   قديم 22-08-2008, 06:30 PM
الرد مع إقتباس
عضو جديد
#14  

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






PHP Developer is offline   قديم 22-08-2008, 07:22 PM
الرد مع إقتباس
عضو نشيط جدا
#15  

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






DNSerror is offline   قديم 22-08-2008, 09:29 PM
الرد مع إقتباس
عضو نشيط
#16  

شكرآ لك يا أستاذ خالد






tech is offline   قديم 23-08-2008, 12:45 AM
الرد مع إقتباس
عضو نشيط
#17  

السلام عليكم

هل هذة الطريقة أفضل

كود PHP:
if($string == '1'){
 
$data 'content';
 

أم هذة

كود PHP:
($string == '1')?$data 'content':''






tech is offline   قديم 23-08-2008, 04:52 AM
الرد مع إقتباس
عضو فعال
#18  

مرحباً ...
أخي أشرف ... شكراً على ردك , وبالنسبه للـSwitch أُفضل إستخدام if ...
وصحيح كلامك بنسه لكثرة الشروط , سابقاً كنت أكتب ...:

كود PHP:
if($text == ""){
print 
"NO TEXT";
}
else
{
if(
$mail == ""){

print 
"NO MAIL";

أما الآن بدأت اختصرها هكذا :
كود PHP:
if($text == "" OR $msg == "" OR $color == "" OR Room == ""){
print 
"Some Value Are Empty";

فـهل هذا أسرع ؟

ولم تجواب عن سؤالي بخصوص mysql_free_result و unset
ولك جزيل الشكر ... الله يوفقك ويزيدك علماً .






__________________
- ( رابط موقع مبرّمج .
- ( رابط موقع قالبي . 
Twitter | Flicker
I Love Windows 7
ff5006 is offline   قديم 23-08-2008, 05:15 AM
الرد مع إقتباس
عضو نشيط
#19  

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






php-man is offline   قديم 23-08-2008, 02:34 PM
الرد مع إقتباس
عضو جديد
#20  

مشكور على الموضوع المفيد






abdalla is offline   قديم 23-08-2008, 09:21 PM
الرد مع إقتباس
عضو نشيط
#21  

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

لدى مشكلة قمت ببرمجة نظام للقوالب ويعمل معى جيدا

لاكن أريد تحسين الأداء

بة عيب واحد عند دخول أعداد كبيرة للموقع يحصل بطى فى الموقع

وانا أتوقع ان المشكلة بسبب فك $GLOBALS

هذا مثال لفهم المشكلة ولاكن مش النظام

كود PHP:
<?
 
class temp{
 
function 
worktemp(){
 
extract($GLOBALS);
 
}
 
}
 
?>
ما فكرت بة أن أخلى المتغيرات فى النظام تعمل هكذا

$GLOBALS['variable'];

وعدم فك GLOBALS

لاكن واجهتنى مشكلة أذا كان لدى مصفوفة وعند كتابتها هكذا

$arr['data']

كيف أدخلها فى globals

وهل هذة الجملة تأخذ وقت أطول لأنى أستخدمها فى الرئيسية

كود PHP:
<?
 
if(file_exists('./includes/text.php')){
echo 
'error';
}else{
include(
'./includes/text.php');
}
 
?>

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







آخر تعديل بواسطة tech في 24-08-2008 الساعة 05:29 AM.
tech is offline   قديم 24-08-2008, 02:53 AM
الرد مع إقتباس
عضو نشيط
#22  

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

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

لدى مشكلة قمت ببرمجة نظام للقوالب ويعمل معى جيدا

لاكن أريد تحسين الأداء

بة عيب واحد عند دخول أعداد كبيرة للموقع يحصل بطى فى الموقع

وانا أتوقع ان المشكلة بسبب فك $GLOBALS

هذا مثال لفهم المشكلة ولاكن مش النظام
الأخ tech

يمكنك إدخال المصفوفه $arr['data'] داخل $GLOBALS (مصفوفة داخل مصفوفة) بالطريقة التالية:

كود PHP:
$GLOBALS['date'] = $arr['data']; 
وعند إستخراج القيم بإستخدام الطريقة التالية

كود PHP:
print_r($GLOBALS['date']); 
خالص تحياتي






php.ye is offline   قديم 25-08-2008, 09:13 PM
الرد مع إقتباس
مشرف قسم PHP
#23  

أتمنى أن يعذرني الجميع لانشغالي هذه الأيام بشكل كبير ..

إقتباس:
المشاركة الأصلية بواسطة tech
السلام عليكم

هل هذة الطريقة أفضل

كود PHP:
if($string == '1'){
 
$data 'content';
 

أم هذة

كود PHP:
($string == '1')?$data 'content':''
وعليكم السلام،

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

لكن أما تساءلت عن الطريقة الاعتيادية الأخرى في كتابة الشروط، مثلاً:
كود PHP:
    if ($string == '1')     $data 'content';
    else echo 
''
فقد تبيّن أن هذه الطريقة أسرع من الطريقة الأسرع بين الطريقتين السابقتين بـ 3.5 مرة تقريباً .. هذا يعني أنها أولى الطرق بالاستخدام بين الطريقتين السابقتين .. لكني أكرر ثانية، كل صيغة واستخدامها ..

وشكراً لمشاركتك النقاش ..

إقتباس:
المشاركة الأصلية بواسطة ff5006
مرحباً ...
أخي أشرف ... شكراً على ردك , وبالنسبه للـSwitch أُفضل إستخدام if ...
وصحيح كلامك بنسه لكثرة الشروط , سابقاً كنت أكتب ...:

كود PHP:
if($text == ""){
print 
"NO TEXT";
}
else
{
if(
$mail == ""){
 
print 
"NO MAIL";

أما الآن بدأت اختصرها هكذا :
كود PHP:
if($text == "" OR $msg == "" OR $color == "" OR Room == ""){
print 
"Some Value Are Empty";

فـهل هذا أسرع ؟

ولم تجواب عن سؤالي بخصوص mysql_free_result و unset
ولك جزيل الشكر ... الله يوفقك ويزيدك علماً .
أهلاً بك عزيزي .. ولا شكر على واجب ..

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

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

بخصوص mysql_free_result و unset ، فاعذرني فقد سهوت عنها وأخذني الحديث فأنسانيها الشيطان أن أذكرها ..

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

عموماً هي مهمة للمواقع الكبيرة التي عليها أن تتحمل ضغط الزوار المستمر وجلب البيانات، إلى جانب أنظمة الكاش بالطبع .. ..

وأهلاً بك أنرت موضوعي بزيارتك ..

إقتباس:
المشاركة الأصلية بواسطة php-man
صراحة موضوع مميز ومثل هاته المواضيع تستحق أن تتثبت لأجل غير محدد لما لها من فائدة
شكرا لك أخي أشرف على فتح الموضوع وتثبيته
بالنسبة للأخ ff5006 أعتقد بأن طريقة الشرط الثاني هي الطبيعية واللازمة وهي أحسن من الطريقة الأولى
شكراً لردك عزيزي .. قمت بفتح الموضوع بهدف بدء النقاش بين الأعضاء وهذا ما قد حصل بالفعل إلا أنني تأخرت في الرد معتذراً لكم ..

ملاحظة: لست من قام بتثبيت الموضوع حيث أن صلاحياتي في القسم لا تعني تثبيت مواضيعي .. المواضيع تثبّت برأيي حسب أهميتها لدى بقية المشرفين ..

وشكراً لك مرة أخرى لزيارتك الموضوع وتعقيبك ..

إقتباس:
المشاركة الأصلية بواسطة abdalla
مشكور على الموضوع المفيد
واجبي ..

إقتباس:
المشاركة الأصلية بواسطة tech
السلام عليكم ورحمة اللة وبركاتة

لدى مشكلة قمت ببرمجة نظام للقوالب ويعمل معى جيدا

لاكن أريد تحسين الأداء

بة عيب واحد عند دخول أعداد كبيرة للموقع يحصل بطى فى الموقع

وانا أتوقع ان المشكلة بسبب فك $GLOBALS

هذا مثال لفهم المشكلة ولاكن مش النظام

كود PHP:
<?
 
class temp{
 
function 
worktemp(){
 
extract($GLOBALS);
 
}
 
}
 
?>
ما فكرت بة أن أخلى المتغيرات فى النظام تعمل هكذا

$GLOBALS['variable'];

وعدم فك GLOBALS

لاكن واجهتنى مشكلة أذا كان لدى مصفوفة وعند كتابتها هكذا

$arr['data']

كيف أدخلها فى globals

وهل هذة الجملة تأخذ وقت أطول لأنى أستخدمها فى الرئيسية

كود PHP:
<?
 
if(file_exists('./includes/text.php')){
echo 
'error';
}else{
include(
'./includes/text.php');
}
 
?>

وكل عام وأنتم بخير
وعليكم السلام ورحمة الله وبركاته، أهلاً مرة أخرى ههه ..

جرب هذا:
كود PHP:
$GLOBALS['arr']['data']; 
أتمنى أن يكون هذا قصدك، يمكنك كذلك تمرير البيانات من خلال باراميتر للفنكشن ..

إقتباس:
المشاركة الأصلية بواسطة php.ye
السلام عليكم ورحمة الله وبركاته
شكراً أخي أشرف على هذا الموضوع المهم ونحب نتعلم أكثر عن تحسين الأداء

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

لدى مشكلة قمت ببرمجة نظام للقوالب ويعمل معى جيدا

لاكن أريد تحسين الأداء

بة عيب واحد عند دخول أعداد كبيرة للموقع يحصل بطى فى الموقع

وانا أتوقع ان المشكلة بسبب فك $GLOBALS

هذا مثال لفهم المشكلة ولاكن مش النظام
الأخ tech

يمكنك إدخال المصفوفه $arr['data'] داخل $GLOBALS (مصفوفة داخل مصفوفة) بالطريقة التالية:

كود PHP:
$GLOBALS['date'] = $arr['data']; 
وعند إستخراج القيم بإستخدام الطريقة التالية

كود PHP:
print_r($GLOBALS['date']); 
خالص تحياتي
وعليكم السلام ورحمة الله وبركاته، أهلاً بك عزيزي ولا شكر على واجب ..

شكراً لمداخلتك وتعليقك وننتظر إضافاتك ..

ختاماً، اعذروني مرة أخرى لتأخري في الرد أولاً ، ثم لأنني أكاد أنام على لوحة مفاتيحي من شدة النعس والتعب، يعني لاحد يلومني إذا كنت أخبّص فووق ^^ ..

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

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






__________________
# ( رابط ) مدونة أشرف السمهوري، مبرمج من الأرض المباركة
# اتبعني على Twitter
# لا أستخدم ماسنجر أو Facebook ..
# أرسل لي رسالة قصيرة SMS سريعاً: ( رابط ) http://sms.ashraf.ms
( حروف إنجليزية فقط )
أشرف السمهوري is offline   قديم 28-08-2008, 01:01 AM
الرد مع إقتباس
عضو نشيط
#24  

هذه الموضوع ايضا يتكلم عن نفس موضوعنا : ( رابط ) الدكتور نت
استخدام علامتي التنصيص للوصول لحقل في المتسلسلة 7 مرات اسرع بدونها و سبب بسيط كلاتي :
لو انك قمت بكتابة الجمله البسيطه التاليه
كود PHP:
echo 'hello world ' 
سيقوم المفسر - interpreter - باعتبارها نص و طباعتها مباشره
اما في حالة كتابتك للجمله التاليه
كود PHP:
echo "hello world" 
فسيقوم المفسر بلبحث عن special characters و متغيرات وعمل عملية parsing وبتالي يتطلب ذلك وقتا اضافيا.






احمد شكر is offline   قديم 28-08-2008, 12:30 PM
الرد مع إقتباس
مشرف قسم PHP
#25  

إقتباس:
المشاركة الأصلية بواسطة احمد شكر مشاهدة مشاركة
هذه الموضوع ايضا يتكلم عن نفس موضوعنا : ( رابط ) الدكتور نت
استخدام علامتي التنصيص للوصول لحقل في المتسلسلة 7 مرات اسرع بدونها و سبب بسيط كلاتي :
لو انك قمت بكتابة الجمله البسيطه التاليه
كود PHP:
echo 'hello world ' 
سيقوم المفسر - interpreter - باعتبارها نص و طباعتها مباشره
اما في حالة كتابتك للجمله التاليه
كود PHP:
echo "hello world" 
فسيقوم المفسر بلبحث عن special characters و متغيرات وعمل عملية parsing وبتالي يتطلب ذلك وقتا اضافيا.
شكراً أخي أحمد لمرورك وتعقيبك ..

بخصوص كلامك فبصراحة لا أدري أنت تطرقت لموضوعين في آن واحد ..

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

والآخر هو المثال الموجود في ردك، وهذا كنت قد تطرقت له إجمالاً في الموضوع ..

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

شكراً لإضافتك، وننتظر المزيد ..

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






__________________
# ( رابط ) مدونة أشرف السمهوري، مبرمج من الأرض المباركة
# اتبعني على Twitter
# لا أستخدم ماسنجر أو Facebook ..
# أرسل لي رسالة قصيرة SMS سريعاً: ( رابط ) http://sms.ashraf.ms
( حروف إنجليزية فقط )
أشرف السمهوري is offline   قديم 29-08-2008, 10:19 PM
الرد مع إقتباس
الرد على الموضوع


 

أدوات الموضوع

قوانين المشاركات
لا يمكنك كتابة مواضيع جديدة
لا يمكنك إضافة ردود
لا يمكنك إرسال مرفقات
لا يمكنك تعديل مشاركاتك

كود vB متاح
كود [IMG] متاح
كود HTML غير متاح
Trackbacks are متاح
Pingbacks are متاح
Refbacks are متاح


المواضيع المشابهه
الموضوع كاتب الموضوع القسم الردود آخر مشاركة
كبسولة دواء DELGRA التصميم والرسومات والمونتاج 2 24-07-2007 04:56 PM
دواء لمرض الغرغرينة مجرب Kuwaitna القسم العام 5 13-05-2007 02:29 PM
لعدد محدود نشر وتحسين موقعك في محركات البحث Arabip.com التجارة في الأشياء الأخرى 10 20-03-2006 02:16 PM
دواء الصلع ( رسم كومك) عبدالعزيز صادق التصميم والرسومات والمونتاج 9 09-06-2003 01:58 AM
برنامج رائع جدا لتصحيح وتحسين كود HTML code4arab الويب والويب 2.0 والتجارة الالكترونية 8 06-02-2003 12:54 PM


جميع الأوقات بتوقيت غرينتش +3. الوقت الآن هو 03:34 PM.