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

الموضوع: كاش لمخرجات قاعدة البيانات ، هل من علة فيه ؟ (دعوة للنقاش)

  1. #1

    كاش لمخرجات قاعدة البيانات ، هل من علة فيه ؟ (دعوة للنقاش)



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

    مقدمة :
    في مدخل السنة الحالية تركت إطار العمل Codeigniter و قررت بناء إطار عمل خاص بي ، و السبب هو أني أردت برمجة منتجات تجارية و الـ CI برمجية مجانية ، و نفس الموقف إتخذته مع إطار عمل خاص بصديق لي كنت شاركته في بنائه حيث قال أنه مفتوح المصدر ... ، و الآن حوّلت الإطار إلى برنامج خاص حسب طبيعة إحتياجاتي و عملي ،... إلخ

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

    في كلاس قواعد البيانات نجد دالة الجلب get و دالة الحقن insert و دالة التحديث update و دوال أخرى قد تقوم بنفس المهام ...

    عند إستخدام get يقوم كلاس الكاش بإنشاء ملف كاش إسمه هو الإستعلام مشفر ب md5 ، و عند جلب نفس البيانات مرة أخرى فطبيعي أن يكون الإستعلام نفسه ، لذلك يتحقق من وجود ملف الكاش بنفس الإسم ، فإن كان موجودا تم جلب الملف و الإستغناء عن الإستعلام (لاحظ هنا أنه لا يتم الإستعلام)

    عند الحقن و التحديث نفس الشيء لكن يقوم بحذف ملف الكاش ، ليتم إنشاؤه عند أول إستعلام مستقبلي ...

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

    الفكرة أعتقد مفهومة ، و السؤال الآن :
    هل الطريقة موجودة في برامج معروفة ؟ (لأنها نتاج تفكيري الخاص ، لكن أعتقد انها موجوة)
    إن لم تكن موجوده فهل هذا يعني أن بها عيبا و علة ؟

    مبدئيا لا يبدو أن في الأمر علة ، لكن الخبرات تتعدد و تتنوع ، لذلك أتمنى النقاش حولها .

    أخوكم خالد .







  2. #2


    وعليكم السلام والرحمة ...

    بالبداية اسمحلي ابدي اعجابي بطريقة تحليلك للمعطيات وبرمجتك للنظام بناء على تحليل جيد ...

    لكن اعيب عليك نقطة واحدة ، وهي من كلامك أنك لا تقتنع بالمنتج إلا إذا كانت هناك سكربتات عالمية تنفذ طريقتك !

    فللأسف إن كان فهمي صحيح لحالتك ، فأنت ستكون مقيد جدا ، لأن مبرمجين السكربتات الاخرى ليسوا ملائكة ، وكل واحد منهم له تفكير الخاص ، وممكن هو سوى دالة ولا كلاس ويكون الأسوء ..

    فلذلك مادام تحليلك منطقي وفعال ، فأنت بالطريق الصحيح

    أما بالنسبة للآلية ، فأظنها صحيحة 100% ، وعلى العكس هي منطقية ومميزة جدا جدا .. فبطريقتك تمنع عمل استعلامات كل مرة ، وبالتالي يتم التخفيف على قواعد البيانات ...

    لكن يجب انك تتأكد انه كل استعلامات التحديث تقوم بحذف الكاش الخاص بها بعد تنفيذ الاستعلامات وذلك لعدم تأخر وصول المعلومات ، وايضا لو تجعل لكل جدول مثلا من القواعد ملفات كاش خاصة بإضافة بادئة باسم الجدول ، وبالتالي عند الحذف تحذف الملفات الخاصة بالجدول فقط ... << أظنك انتبهت لهذه النقطة !

    تحياتي لك





    __________________
    زورونا في موقع الحياة للنقاشات والأسئلة والأجوبة :
    - php >> وهو لحل مشاكل php وما حولها
    - Ideas >> وهو لعرض الأفكار وتقييمها وايضا لمناقشة الأفكار

  3. #3
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,516


    السلام عليكم خالد ...

    في موقع النكت ... وصلت ل 20000 زيارة يومية و 120000 صفحة يومية ....
    عند استعمال الكاش الذي استعملته انت بالضبط ... لاحظت انني لم احرز اي تخفيض للضغط على السيرفر وخاصة انني كنت لا ازال افتح قناة اتصال بقاعدة البيانات ...
    قمت بتعديل نظام الكاش لموقعي ( وللعلم فهو برمجة شخصية بدون استعمال اي منصة ) ... قمت بالاستغناء عن الاتصال بقاعدة البيانات ... وهذا الأمر خفف الكثير من العبء وقلل كمية الاتصالات بقاعدة البيانات ...

    ينقص فقط في ما شرحت عن الكاش - دالة الزمن ... لا يكفي ان تفحص اذا كان الكاش موجود ... يجب أن تفحص وقته ...
    كود:
    $cacheFile=someFunctionToGenerateCacheFileName();
    $cacheTime=60*60;
    $cacheCreated = @file_exists($cacheFile) ? @filemtime($cacheFile) : 0;  
    
    if (  time() - $cachetime ) < $cachefile_created ) {  // Go Read Cache ; }
    الآن - بالنسبة لتشفير الاسم هنا يوجد لدي نصيحة
    اذا كان موقعك برمجة شخصية وهو موقع صغير - لا تقم بتشفير كل عنوان الملف - قم باستعمال الدالة
    someFunctionToGenerateCacheFileName
    لبرمجة طريقة ما لخلق اسم ملف بدون تشفير -
    هذه الطريقة متعبة بعض الشئ - لكنها مفيدة لك لأن
    http://arab-jokes.net/
    http://arab-jokes.net/?
    ستعطيك ملفان اثنان للكاش وهما متساويين
    لكن لو بنيت ملف الكاش بحسب المتغيرات الرئيسية التي تعرفها في موقعك فقد يكون هذا افضل

    الشئ الثاني
    قم باستخدام وقتان اثنان للكاش
    وقت للملفات الرئيسية
    ووقت للصفحات الداخلية المهمشة

    مثال:
    تصل لصحفة رئيسية في موقع النكت لدي بكل زيارة
    ولكن الصفحة 15 من التصنيف 23 قد لا يزوره شخص كل 60 دقيقة - لذا لهذه الصفحات مفضل استعمال وقت كاش اطول من الصفحات الرئيسية

    انا مثلاً - اضفت هذا الشرط لدي
    كود:
    if($pageNumber>6) $cacheTime=60*60*24






    __________________
    أحب سوالف ولا احب الجدليين!
    اسماء اولاد وبنات http://muslim-names.us
    1000 مزاد http://1000mazad.com
    موقع نكت سعوديةhttp://arab-jokes.net

  4. #4


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

    شادي ، تجربتك أفادتني كثيرا حيث ينقصني الزوار للتجربة الفعلية (في الوقت الحالي)
    سؤال : لماذا أستخدم الوقت في طريقتي ؟
    الوقت برمجته لكن أستخدمه في مناطق أخرى و ليس في كلاس قواعد البيانات .

    ملاحظات للجميع :
    1 - الكاش هو كاش جزئي و ليس كاش صفحات كاملة ، أستخدم serialize لحفظ المخرجات و الوقت في نفس الملف ، لكن الوقت لا أستخدمه بتاتا لأن الملف يحذف تلقائيا عند تحديثه أو حذفه
    2 - إذا كان لدينا صفحة فيها خمس استعلامات فهذا يعني 5 ملفات كاش !
    3 - توجد آلية لإيقاف الكاش على كامل النظام و في نفس الوقت يحذف ملفات الكاش بدل التحقق منها و تحديثها ...
    4 - أرجو تصويبي نحو الطريق الصحيح في حال كنت على خطأ

    شكرا لكم






  5. #5
    عضو فعال
    تاريخ التسجيل
    Jun 2008
    المشاركات
    1,600


    اﻻخوان كفوا ووفوا

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

    بالنسبة لعملية اﻻتصال بقاعدة البيانات بحد ذاتها فهي من العمليات المكلفة اذ انها تتطلب تسجيل وتحقق من بيانات المستخدم
    قبل اتاحة استعمال اﻻستعلامات
    لذا من اﻻفضل ان تعمل لها lazy loading في php5 عن طريق استعمال الكلاسات
    اذ ان ال magic method المسماة __autoload في كلاسات ال php يتم استدعاؤها عندما لا تجد الكلاس
    المطلوب.
    وبالتالي تعمل استدعاء لكلاس قواعد البيانات واﻻتصال بها فقط عندما تحتاج لذلك وذلك عن طريق autoload

    هناك تقنية في الجافا لم اجدها كاملة في ال php,وتسمى connection pools ، اي انك تحتفظ في اﻻتصال بقاعدة البيانات
    في الذاكرة ، وتقوم باستدعاءه وقت الحاجة(يعني تكون مسجل دخول للقاعدة)
    اﻻمر ذاته موجود في php مع الدالة mysql_pconnect ولكنها غير مستقرة وتسبب مشاكل من حيث الوصول
    لعدد اﻻتصالات اﻻقصى بقواعد البيانات.

    الشيء اﻷخير الذي لاحظته في البرمجة سابقة الذكر، هو ان المبرمج وقد كان كلف نفسه وعمل كلاس لقواعد البيانات، لكن
    لم يقم عمليًا باﻻستفادة من ميزات هذا اﻻمر، اذ انه يعيد النتيجة ك mysql result set يعني يعيد:
    كود PHP:
    mysql_query($query
    طيب ماذا سأستفيد من الكلاس اذا لم اكن اقدر ان اعمل كاش للنتائج قبل ارجاعها للبرنامج، اذ ان هذا الكائن غير قابل للتكييش
    بل يجب عليك ان تقوم بارجاع مصفوفة من كلاس قواعد البيانات .
    ايضًا لن تستطيع ان تقوم باستعمال انواع اخرى من قواعد البيانات اذ انك ترجع كائن تابع لل mysql وحدها.






  6. #6


    بالنسبة للإتصال بقواعد البيانات ففعلا أتحكم فيه ، و يمكن إيقاف الإتصال في أي مكان أريده ، لكن لم أكتب آلية لإيقاف الإتصال إذا كان الكاش موجود لأن الكاش جزئي و إيقاف الإتصال ثم الإتصال من جديد عدة مرات في صفحة واحدة سيكون كارثة ، لذلك لم أجد آلية قد تفيد لحل الآن

    لإلقاء نظرة عن نتيجة الإستعلام في ملف الكاش (المخرجات)

    كود PHP:
    a:2:{s:16:"__cache_contents";a:5:{i:0;O:8:"stdClass":9:{s:2:"id";s:1:"1";s:7:"menu_id";s:1:"1";s:5:"title";s:16:"الرئيسية";s:3:"url";s:0:"";s:9:"after_url";s:0:"";s:6:"target";s:5:"_self";s:6:"active";s:1:"1";s:8:"order_by";s:1:"0";s:6:"config";s:0:"";}i:1;O:8:"stdClass":9:{s:2:"id";s:2:"14";s:7:"menu_id";s:1:"1";s:5:"title";s:14:"الدورات";s:3:"url";s:11:"courses/all";s:9:"after_url";s:0:"";s:6:"target";s:5:"_self";s:6:"active";s:1:"1";s:8:"order_by";s:1:"1";s:6:"config";s:0:"";}i:2;O:8:"stdClass":9:{s:2:"id";s:2:"20";s:7:"menu_id";s:1:"1";s:5:"title";s:16:"المدربون";s:3:"url";s:15:"courses/trainer";s:9:"after_url";s:0:"";s:6:"target";s:5:"_self";s:6:"active";s:1:"1";s:8:"order_by";s:1:"1";s:6:"config";s:0:"";}i:3;O:8:"stdClass":9:{s:2:"id";s:2:"17";s:7:"menu_id";s:1:"1";s:5:"title";s:20:"الإستشارات";s:3:"url";s:2:"qa";s:9:"after_url";s:0:"";s:6:"target";s:5:"_self";s:6:"active";s:1:"1";s:8:"order_by";s:1:"2";s:6:"config";s:0:"";}i:4;O:8:"stdClass":9:{s:2:"id";s:2:"19";s:7:"menu_id";s:1:"1";s:5:"title";s:23:"أخبار المركز";s:3:"url";s:10:"news/cat/3";s:9:"after_url";s:0:"";s:6:"target";s:5:"_self";s:6:"active";s:1:"1";s:8:"order_by";s:1:"6";s:6:"config";s:0:"";}}s:15:"__cache_created";i:1299763534;} 
    unserialize لمن يريد رؤية الإستعلام






  7. #7
    عضو فعال
    تاريخ التسجيل
    Jun 2008
    المشاركات
    1,600


    ما هذا قصدت

    انما ما اقصد ان هناك اشخاص يقومون بتعريف اﻻتصال بقاعدة البيانات على رأس كل صفحة في السكربت
    وبالتالي أحيانًا يتم تعريف الكائن بدون حاجة فعلية لذلك






  8. #8
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,516


    أنا ذهبت اذاً بطريق آخر غير الذي تقصده ...

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

    لكن - افضل شئ هو استعمال كلاسات تستعملها جوملا لهذا الغرض ... انا استعملتها مرة ... كان صعب علي تصييغها للعمل لمشروعي ... لكنها في النهاية اعطتني نتائج جيدة ...





    __________________
    أحب سوالف ولا احب الجدليين!
    اسماء اولاد وبنات http://muslim-names.us
    1000 مزاد http://1000mazad.com
    موقع نكت سعوديةhttp://arab-jokes.net

  9. #9


    ما هذا قصدت

    انما ما اقصد ان هناك اشخاص يقومون بتعريف اﻻتصال بقاعدة البيانات على رأس كل صفحة في السكربت
    وبالتالي أحيانًا يتم تعريف الكائن بدون حاجة فعلية لذلك
    حسنا هذه طريقة أعتقد بدائية نوعا ما ، أما برمجيتي فلديها محرك واحد و العمل على طريقة MVC






  10. #10


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

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

    شكرا .






  11. #11
    عضو فعال
    تاريخ التسجيل
    Dec 2008
    المشاركات
    1,897


    و عليكم السلام و رحمة الله و بركاته .
    حياك الله خالد ، لدي ملاحظة بسيطة فقط في نقطة التأكد اذا ما كان الكاش يتوفر على ملف او لا ..
    فرضا ان هناك 100000 صفحة هل سيقوم البرنامج بهذا العدد من التحقق كل مرة ؟ اقترح عليك ان تقوم بعمل تحقق كل X ساعة افضل لعمل Optimization اكثر للقاعدة .





    __________________
    راسلني

  12. #12


    و عليكم السلام و رحمة الله و بركاته .
    حياك الله خالد ، لدي ملاحظة بسيطة فقط في نقطة التأكد اذا ما كان الكاش يتوفر على ملف او لا ..
    فرضا ان هناك 100000 صفحة هل سيقوم البرنامج بهذا العدد من التحقق كل مرة ؟ اقترح عليك ان تقوم بعمل تحقق كل X ساعة افضل لعمل Optimization اكثر للقاعدة .
    أهلا حمزة ،
    يتم التأكد من ملف الكاش و ليس محتواه ، لذلك لا أعتقد أنه يوجد مشكل من هذه الناحية !

    هل يوجد ؟






  13. #13
    عضو سوبر نشيط
    تاريخ التسجيل
    Nov 2005
    المشاركات
    779


    اﻻخوان كفوا ووفوا

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

    بالنسبة لعملية اﻻتصال بقاعدة البيانات بحد ذاتها فهي من العمليات المكلفة اذ انها تتطلب تسجيل وتحقق من بيانات المستخدم
    قبل اتاحة استعمال اﻻستعلامات
    لذا من اﻻفضل ان تعمل لها lazy loading في php5 عن طريق استعمال الكلاسات
    اذ ان ال magic method المسماة __autoload في كلاسات ال php يتم استدعاؤها عندما لا تجد الكلاس
    المطلوب.
    وبالتالي تعمل استدعاء لكلاس قواعد البيانات واﻻتصال بها فقط عندما تحتاج لذلك وذلك عن طريق autoload

    هناك تقنية في الجافا لم اجدها كاملة في ال php,وتسمى connection pools ، اي انك تحتفظ في اﻻتصال بقاعدة البيانات
    في الذاكرة ، وتقوم باستدعاءه وقت الحاجة(يعني تكون مسجل دخول للقاعدة)
    اﻻمر ذاته موجود في php مع الدالة mysql_pconnect ولكنها غير مستقرة وتسبب مشاكل من حيث الوصول
    لعدد اﻻتصالات اﻻقصى بقواعد البيانات.

    الشيء اﻷخير الذي لاحظته في البرمجة سابقة الذكر، هو ان المبرمج وقد كان كلف نفسه وعمل كلاس لقواعد البيانات، لكن
    لم يقم عمليًا باﻻستفادة من ميزات هذا اﻻمر، اذ انه يعيد النتيجة ك mysql result set يعني يعيد:
    كود PHP:
    mysql_query($query
    طيب ماذا سأستفيد من الكلاس اذا لم اكن اقدر ان اعمل كاش للنتائج قبل ارجاعها للبرنامج، اذ ان هذا الكائن غير قابل للتكييش
    بل يجب عليك ان تقوم بارجاع مصفوفة من كلاس قواعد البيانات .
    ايضًا لن تستطيع ان تقوم باستعمال انواع اخرى من قواعد البيانات اذ انك ترجع كائن تابع لل mysql وحدها.
    اخي العزيز
    شكرا لك على مشاركتك المفيده جدا جدا
    هل ممكن تشرح اكثر autoload وكيف الاستفاده منها بطريقة احترافيه ( optimizing )





    __________________
    أهلا و سهلا بكم في :-
    موقع دار الأوائل
    تفضل معنا خدمات الاستضافة
    موقع العبقري لخدمات الاستضافة

  14. #14
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,516


    Autoload هي تقنية تخص php5 تؤجل معالجة الكلاسات فقط الى وقت الحاجة لها.





    __________________
    أحب سوالف ولا احب الجدليين!
    اسماء اولاد وبنات http://muslim-names.us
    1000 مزاد http://1000mazad.com
    موقع نكت سعوديةhttp://arab-jokes.net

  15. #15
    عضو فعال
    تاريخ التسجيل
    Jun 2008
    المشاركات
    1,600


    سوف اعطيك مثال اخي خالد(واخي العزيز عبقري العرب) من ال codeigniter حتى تصل الصورة

    نفرض ان عندك متحكم يستعمل قاعدة البيانات

    ممكن ان تعرف اﻻتصال بقاعدة البيانات في البناء constructor
    طيب اذا كنت عامل كاش ولم تتصل بقاعدة البيانات ابدًا، بالتالي سوف تعمل اتصال بدون فائدة

    ممكن ان تعرف اﻻتصال عند الحاجة إليه وبعد فحص اذا كان هناك كاش ام لا
    وبالتالي تضيف شروط وتسبب في تكرار الكود او عمل دوال اضافية

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

    للتحكم بالمصادر هناك دوال خاصة في ال php تساعدك في ذلك، وهي مشابهة لل zend_registry او غيرها في اطر العمل المختلفة
    http://de.php.net/manual/en/function...d-register.php
    http://de.php.net/manual/en/function.spl-autoload.php





    التعديل الأخير تم بواسطة ahmad sadiq ; 11-03-2011 الساعة 07:31 PM





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

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

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