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

 

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

رد  
 
LinkBack أدوات الموضوع
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#1 (permalink)  
إستعلامات mysql متقدمة


لم أكن أعلم ذلك مسبقاً ، لكن الإستعلامات التي على الشاكلة التالية تعمل بالفعل !
كود PHP:
select topic from posts where id in (
    
select post from r where item = (
        
select id from items where name 'php' and type 1
    
)

عموماًَ ، كيف يمكن تطبيق إستعلام الدمج ( join ) على الإستعلام السابق ؟ وماهي الصيغة العامة لهذا النوع من الإستعلامات ؟






dev11 غير متواجد حالياً   قديم 15-06-2008, 06:33 PM
رد مع اقتباس
Moderator
تاريخ التسجيل: Aug 2004-
#2 (permalink)  

السلام، هذه الخاصيه موجوده مع الاصدار الخامس من MySQL وتسمى inline select statement او embedded statement وتتعامل معها مثل الجدول الطبيعي فمثلا تستطيه ان تقول "اعطني كل اسم مستخدم اسمه يبدأ او ينتهي بخالد ولكن سجل بعد العام 2007"
كود:
select * from 
( select * from records where register_date > "01-01-2007" ) 
as smaller_table 
where smaller_table.username LIKE "%khalid%" Limit 0,10
ملاحطة: الاستعلام الاول يستطيع استخدامه في امر استعلام واحد ولكن انا استخدمته للشرح فقط

الاستخدام سهل. ولكن له عيوب ومساوء وايظاً ايجابيات، تخيل ان لديك جدول كبير. وتريد ان تأخذ معلومه من جدول وتطابقه بجدول أكبر. مثلا تريد ان تبحث عن عدد الاهدافه للفريق ليفربول بعد العام 2005، كما تعرف جدول الاعبين كبير وعدد الاهداف في جدول الاهداف كبيره جدا؟

فمثلا فعلت هذا
كود:
select count(*) from players,teams,goals 
where team.name = "liverpool" and  players.team_id = team.id and
 goals.player_id = players.id and goals.date > "01-01-05"
فأدا هناك 30 لاعب في ليفر بول و 1000 لاعب في جدول اللاعبين.. و 300 فريق و 10000 هدف في قاعده البيانات، فستبخث في 300 سطر من القرق .. ثم تطابق رقم ذالك الفريق بالاعبين .. فكلما وصلت للاعب من ليفربول ستبحث في جدول الاهداف من اوله الى اخره "ويحتوي على 10000 سجل" ثم تجمع عدد الاهداف و تكرر تلك العمليه 30 مره ثم تفرز جميع الاهداف وتختار ماهو فقط بعد العام 2005 !!!!!! ليش؟؟ اي انك فعلت بحث في (30x10000) زائد 300 زائد 1000 .. اذا بحثت في 301300 سجل لكي تصل للحل !!! لماذا ؟؟

فلتسهيل العمليه هي في تقليل عدد السجلات التي تبحث فيها .. اي اذا عرفت انك ستبحث في جدول كبير ولكن تعرف ان كل الاهداف التي تريد ان تحسبها هي بعد العام 2005 .. فلماذا لا تبحث في المطلوب فقط؟؟

كود:
select count(*) from players,teams, 
( select * from goals where date > "01-01-05") as goals 
where team.name = "liverpool" and  players.team_id = team.id and
goals.player_id = players.id
طبعا هذي الطريقه اسرع . ولكن له عيب وهو انك ستستخدم جدول عشوائي تستخدمه مره واحده وسيكون كليا في الذاكره ويمسح بعد عمليه الاستعلام .. فاستخدم الحل هذا مع السرفرات التي لها رام كبير .. ماعدى ذالك تعلم استخدام الcache او بدأ بقرأه المانوال الخاص في الMySQL في تحسين اداء السرفر ...

اخوك خالد






__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو

التعديل الأخير تم بواسطة : hilaby بتاريخ 16-06-2008 الساعة 06:40 AM. سبب آخر: تعديل الاخطاء الاملائيه و تعديل لشرح افضل
hilaby غير متواجد حالياً   قديم 15-06-2008, 10:12 PM
رد مع اقتباس
مشرف قسم ويب 2.0 و البرمجية القياسية
تاريخ التسجيل: Mar 2003-
#3 (permalink)  

ماشاءالله عليك يا اخوي خالد

دائما شرحك رائع

الله يوفقك ان شاءالله






__________________
#
محمد "محلل لنظم المعلومات" - برمجه وتحليل
flash, flex, s e o, javascript, actionscript, php
لمراسلتي إضغط هنا

[ 1 ][فلاش] مقدمه : ما هي لغة الاكشن سكريبت وماهو الفلاش
MohDesign غير متواجد حالياً   قديم 15-06-2008, 10:44 PM
رد مع اقتباس
مشرف قسم PHP
تاريخ التسجيل: Apr 2002-
#4 (permalink)  

- ميزة الاستعلام الفرعي subselect اكثر من رائعة, لكن يجب عليك ان تعرف متى تستخدمها فهو ليس شائع الاستخدام في التطبيقات ... غالبا ما يتم الاستعلام من جدول بدلالة حقول معينه او يكون من جدولين مع الربط بينها ووضع الشرط اللازم , كما هو مثال hilaby يمكن ان يكون ببساطة
كود PHP:
select from records where register_date '01-01-2007' AND username LIKE '%khalid%' Limit 0,10 
- من حالات الاستعلام الفرعي مثلا في oracle ان تعيد عدد سجلات معين من نتيجة بحث مرتبه بالتاريخ .
كود PHP:
SELECT FROM (SELECT FROM table_name WHERE name like '%swalif%' ORDER BY dateWHERE rownum <=10 
- لا اجد الاستعلام الفرعي شائع الاستخدام , لكنه يستخدم في استخلاص بينات من جداول ليس بينها علاقات ............. هل هناك امثله لذلك !






__________________
I Love PHP (d4d@hotmail.com)
http://www.daif.net/
daif غير متواجد حالياً   قديم 16-06-2008, 02:05 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#5 (permalink)  

شكراً لك أستاذ hilaby ، وفعلاً كما قلت الـ cache مهمة في هذه الحالة لتحسين آداء الخادم وبما أنني مهتم بهذه النوعية من الإستعلامات فإنني بالطبع سأقرأ عن هذه الخاصية ، هل يمكنك أن تعطينا نبذة قصيرة عنها ( خاصية الـ cache ) ؟ ، أيضاً أنا مهتم بإستعلامات الـ join .. فكيف سأقوم بتطبيق الـ join على الإستعلام السابق ؟

أستاذ daif .. لا أعتقد أنه يمكن تطبيق هذه الخاصية على الجداول التي لايوجد بينها علاقات ..

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

لوكان لدينا في جدول التصانيف البيانات :

كود:
code
javascript
وفي جدول المقالات :

كود:
sessions in php
cookies in javascript
فإنهما إن كانا على هذه البنية فلا يمكن الربط بينها أبداً ( هذا ما أظنه ) .. لابد من وجود حقل إضافي ذو قيمة فريدة في جدول التصنيفات وحقل إضافي في جدول المقالات يحتوي على رقم التصنيف المرتبط به ( هذه طريقة ) وهناك طرق أخرى لا أعلمها ، فإن كانت لديك طريقة للربط بين الجدولين دون التغيير في بنيتهما الحالية فهلا شاركتها معنا

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

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






dev11 غير متواجد حالياً   قديم 16-06-2008, 12:12 PM
رد مع اقتباس
Moderator
تاريخ التسجيل: Aug 2004-
#6 (permalink)  

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

انا سأكتب شيء اكثر تفصيلا بعد الدوام ..
ولكن الى ذالك الوقت تستطيع ان تقرأ عن الcache وطريقه استخدامها بعد ناتج احد النقاشات التي قام بها احد الاعضاء في سوالف معي على الرابط
كيف يمكن عمل ذلك في php - كلاس تصغير الصور - سوالف سوفت

واذا اردت مدونه خاصه تتكلم فقط عن تحسين أداء الMySQL قم بقرائه مقالات المدونه MySQL Performance Blog فيها معلومات جدا قيمه






__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو
hilaby غير متواجد حالياً   قديم 16-06-2008, 01:03 PM
رد مع اقتباس
مشرف قسم PHP
تاريخ التسجيل: Apr 2002-
#7 (permalink)  

dev11
نعم كما ذكرت لا بد من وجود رقم فريد في التصنيفات ويتم ادخاله في المقالات حتى تستطيع الربط بينها .
هل يمكن أن تشرح ماذا تريد ان تفعل عمليا ! كما ذكرت ان استخدامات الاستعلام الفرعي ضيقة جدا .






__________________
I Love PHP (d4d@hotmail.com)
http://www.daif.net/
daif غير متواجد حالياً   قديم 16-06-2008, 03:29 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: Nov 2005-
#8 (permalink)  

شكرا لكم اخواني .. نورتونا بحديثكم المتقدم حول الاستعلامات

اريد ان استفسر ..
هل يمكن عمل تحديث لعدة صفوف باستعلام واحد ؟؟ ( طبعا التحديث لحقل بعدة قيم لكل صف و بدون استخدام لووب)






__________________
أهلا و سهلا بكم في :-
موقع دار الأوائل
-----------------
تفضل معنا
خدمات الاستضافة مع تركيب و دعم خاص للبوابة العربية لكافة العملاء
موقع خدمات العرب
عبقري العرب متواجد حالياً   قديم 17-06-2008, 07:41 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#9 (permalink)  

أخي العزيز daif .. ماوضعته ليس سوى مجرد مثال فقط لاغير ، أما عن ما أريد الوصول إليه فهو كيفية تطبيق الـ join على الإستعلام الفرعي الذي قمت بوضعه في بداية الموضوع ..






dev11 غير متواجد حالياً   قديم 17-06-2008, 12:06 PM
رد مع اقتباس
Moderator
تاريخ التسجيل: Aug 2004-
#10 (permalink)  

عبقري العرب "الرد على سؤالك - هل يمكن عمل تحديث لعدة صفوف باستعلام واحد ؟"
كما اعرفه انه لا يوجد .. لانك اذا اردت ان تغير عده حقول مره واحده .. هذا يدل على خلل ما في هيكل قاعده البيانات او تصميمها .. لاننا كما نعلم . اذا وجد اكثر من سجل في جدول معين بنفس البيانات نظع تلك البيانات في جدول اخر ونربطه برابط اجنبي .. "foreign key"
فانا لا ارى اي مثال او لا استطيع ان اتخيل مثال يدل على انك ستريد ان تغير سجلات ببيانات مختلفه يجمعها رمز موحد ..

dev11
اجابتك سهله.. وانا احس ان المثال افضل من الشرح ..

كود:
SELECT * FROM teams, players 
LEFT JOIN (SELECT COUNT(*) as numberOfGoals FROM goals 
WHERE goals.date > "2005-01-01" GROUP BY goals.player_id) 
as goalsAfter2005 
ON players.id = goalsAfter2005.player_id
WHERE 
teams.name = "liverpool" and
players.team_id = teams.id
daif
احس انك تتكلم عن جدول جديد موقت يحتوي على البيانات المطلوبه بطريقه الاستعلامات الفرعيه .. ثم ربطها بجدول موجود .. اضن ان المثال اللذي كتبته للاخ dev11 سيعطيك فكره.

لنقم بمتابعه النقاش لانه من الاشياء الشيقه .. التي هي في اصل تخصصي الحالي






__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو
hilaby غير متواجد حالياً   قديم 17-06-2008, 01:55 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#11 (permalink)  

فعلاً ، لا أعتقد أنه يمكن تحديث أكثر من سجل من خلال إستعلام واحد إلا إن كنت تريد وضع قيمة واحدة في جميع السجلات أو بعض السجلات المحددة ..
كود PHP:
update table set topic 'swalif softs';
// or
update table set topic 'php' where id in (12); 
أستاذ hilaby ، لقد قمت بالقراءة عن إستعلامات الـ join ومما فهمته أن هناك ثلاثة أنواع منها :

inner join : لإستخراج السجلات من الجدولين
left join : لإستخراج السجلات من الجدول الأيسر
right join : لإستخراج السجلات من الجدول الأيمن

الصيغة العامة لهذا النوع من الإستعلامات ..

كود PHP:
select table1.columntable2.column
from table1
table2
where table1
.key_column table2.foreign_key_column
بالمناسبة ، لقد قمت بالقراءة عن الـ mysql query cache ، ومما قرأته إستخلصت مايلي :

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

2 - عندما يتم الإستعلام من قاعدة البيانات .. يتم البحث عن النتائج في البيانات المخزنة من قبل ، إن وُجدت يتم أرسالها إليك وإن لم يتم إيجادها فإنه يتم تنفيذ الإستعلام و إستخراج البيانات ويتم تخزينها في الذاكرة .

3 - عند حدوث أي تحديث على الجدول من ( إضافة ، تعديل ، حذف ) .. فإنه يتم حذف البيانات المخزنة السابقة ويتم إستبدالها بالبيانات المحدثة تلقائياً ، وهذه خاصية جميلة ومفيدة ، في الواقع بسبب هذه النقطة بالذات سأقوم بالتركيز على إستخدام الـ mysql query cache في المستقبل ، طبعاً لابد من الإشارة إلى أن الفرق في السرعة سيكون كبيراً ومؤثراً ، خصوصاً إن كانت لديك قاعدة بيانات بحجم كبير وذات إستعلامات كثيرة ، لكن المشكلة أيضاً تكمن إذا كانت قاعدة البيانات تتحدث بإستمرار كل دقيقة ( خمس دائق ،عشر دقائق أو نصف ساعة ) مثلاً .. ، في هذه الحالة لا يحبذ إستخدام هذه الخاصية لأن الـ cache في هذه الحالة لا فائدة منه على الإطلاق ! فما فائدة تخزين شيء سيتم تحديثه بعد خمس دقائق !

4 - الخيار query_cache_type في ملف الإعدادات إذا كانت قيمته 1 فإن الـ cache سيتم تنفيذه دائما عند إستخراج أي بيانات ، أما إن كانت القيمة 2 فإن البيانات المخزنة سيتم إستخراجها إذا تم طلبها فقط .
كود PHP:
select SQL_CACHE something from table 
هذا ما إستطعت إستخلاصة من قراءة سريعة للمقال The MySQL Query Cache .

لكن مع الأسف لم أستطع تطبيق الإعدادت على الخادم الموجود لدي ، فالخيار query_cache_type غير موجود في ملف my.ini الخاص بإعدادت mysql .. هل من حلول ؟

أستاذ daif .. ماهي الطريقة التي تتبعها في إستخدام الـ cache في برمجية القالب السهل ؟







التعديل الأخير تم بواسطة : dev11 بتاريخ 18-06-2008 الساعة 04:06 PM.
dev11 غير متواجد حالياً   قديم 18-06-2008, 04:02 PM
رد مع اقتباس
مشرف قسم PHP
تاريخ التسجيل: Apr 2002-
#12 (permalink)  

dev11 في قواعد البينات يتم استخدام التخزين المؤقت (cache) عندما يكون الاستعلام بطيء ومعقد او يكون عليه معالجه وغالبا ما تكون المعالجه في php وليس في sql , وهذا يحدث قليلا بالاضافة الى ان السجلات الناتجه قليله بالنسبه للجدول نفسه , لكن بشكل عام استخدام الكاش في كل الاستعلامات سوف يستهل الكثير من الذاكره وهذا سوف يجعل وضع الخادم نفسه سيء .

- القالب السهل عند عرض ملف html يتحقق من تاريخ تعديل الملف اذا كان اكبر من ملف cache سوف يعالج الملف ثم يحدث ملف الكاش وعندما يكون العكس يتعامل مع ملف الكاش مباشره .

hilaby الكاش ليس لحل المشكلة في بنية البينات لكنه طريقة لتسريع علملية تتكرر باستمرا وانت في غنى عنها مثل: ناتج معالجة ملف لا يتم تحديثة الا نادرا مثل القالب السهل , او عرض بينات تحدث بوقت محدد مثل صفحة تداول يتم جلب اسعار الاسهم من قاعدة البينات كل 5 دقائق ثم تخزن في صفحة(تعتبر كاش) تعرض للجميع وكل 5 دقائق تحدث من جديد.






__________________
I Love PHP (d4d@hotmail.com)
http://www.daif.net/
daif غير متواجد حالياً   قديم 18-06-2008, 05:01 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#13 (permalink)  

نعم ، الآنه فهمت الطريقة ، أنت تستخدم الدالة filemtime لايجاد تاريخ تعديل الملف ، اذا كان أكبر من ملف الـ cache يتم تحديثه ومن ثم عرضه والا يتم عرض ملف الـ cache ، الآن أرى أهمية إستخدام القوالب ، وفعلاً هذه الطريقة أفضل من إستخدام الـ mysql query cache لانها لاتستهلك كثيراً من الذاكرة على عكس النظام الاخر .

حسناً ، كيف يمكننا تحويل الإستعلام التالي إلى join ؟
كود PHP:
select topic from posts where id in 
    
select post from r where item = ( 
        
select id from items where name 'php' and type 
    








dev11 غير متواجد حالياً   قديم 18-06-2008, 06:49 PM
رد مع اقتباس
مشرف قسم PHP
تاريخ التسجيل: Apr 2002-
#14 (permalink)  

يمكن وبسهوله , الاستعلام التالي هو بالضبط نفس INNER JOIN أي أنك عندما تستخدم INNER JOIN فانك تستخدم .
كود PHP:
SELECT topic FROM postsritems 
WHERE  posts
.topic r.post
AND r.item=items.id
AND items.name 'php'
AND items.type 
نفس INNER JOIN
كود PHP:
SELECT topic FROM posts
INNER JOIN r ON posts
.topic r.post
INNER JOIN items ON r
.item=items.id
WHERE items
.name 'php'
AND items.type 
لكن لو كان جدول items لا يوجد به type = 1 اذا الاستعلام السابق لن يعيد لك نتيجه , يمكن ان تعمل LEFT JOIN مع items حتى تعود لك نتيجه حتى لو كان الشرط لم يتحقق وكذلك مع r ويمكن عكس العمليه بـ RIGTH JOIN اي يعيد لك items ليس له posts او r .
- كتبت الكود بدون تجربه فعلية لكن اعتقد انه سيعمل






__________________
I Love PHP (d4d@hotmail.com)
http://www.daif.net/
daif غير متواجد حالياً   قديم 18-06-2008, 07:30 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#15 (permalink)  

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






dev11 غير متواجد حالياً   قديم 18-06-2008, 08:39 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#16 (permalink)  

ماذا لو أردنا بناء نظام cache بسيط .. فكيف ستكون الفكرة العامة له ؟






dev11 غير متواجد حالياً   قديم 20-06-2008, 04:02 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#17 (permalink)  

محاولة بسيطة لم تنجح ..

cache.php
كود PHP:
function cache($cache$expire) {
    
$cache1 'cache/'.$cache.'.cache';
    if (!(
file_exists($cache1) and filemtime($cache1) > (time() - $expire))) {
        
ob_start();
        include(
$cache);
        
$content ob_get_contents();
        
ob_end_clean();
        
$fopen fopen($cache1'w');
        
fwrite($fopen$content);
        
fclose($fopen);
    }
    return 
file_get_contents($cache1);

index.php
كود PHP:
include('cache.php');

echo 
'<h1>'.date('h:s:i').'</h1>';

cache('index.php'10); 
ويتم تخزين ملفات الـ cache في مجلد بإسم cache






dev11 غير متواجد حالياً   قديم 20-06-2008, 05:31 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#18 (permalink)  

وجدتها !
كود PHP:
$cache_file 'index.php';
$cache_time 10 60// seconds

$cache_file 'cache/'.md5($cache_file).'.cache';
if (
file_exists($cache_file) and time() - $cache_time filemtime($cache_file)) {
    include(
$cache_file);
    exit();
}

ob_start();

// start

echo '<h1>'.date('h:s:i a').'</h1>';

// end

$fp fopen($cache_file'w');
fwrite($fpob_get_contents());
fclose($fp);

ob_end_flush(); 
حسناً الآن نريد تحويله الى دالة أو صِنف ، نريد أن تكون طريقة إستخدامه
كود PHP:
include('cache.php');
cache(10 60);
echo 
'<h1>'.date('h:s:i a').'</h1>'






dev11 غير متواجد حالياً   قديم 21-06-2008, 09:27 PM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#19 (permalink)  

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






dev11 غير متواجد حالياً   قديم 24-06-2008, 12:39 PM
رد مع اقتباس
Moderator
تاريخ التسجيل: Aug 2004-
#20 (permalink)  

السلام عليكم.. لماذا لا نستخدم خواص الPHP5؟ .. لماذا لا نطور نفسنا قليلا؟

الطريقه التي سأطرحها لكم هي فكره قديمه تكلمت عنها في الموضوع http://www.swalif.net/softs/swalif45...8/#post1584325

الكلاس يستخدم الكلاس المفتوح المصدر CacheLite الموجود في اكثر السرفرات ... واذا لم يجد لديك قم بكتاب
كود:
pear install Cache_Lite
على الDOS .. ونفس الطريقه على الlinux والmacOS

الكلاس اللذي عملته هو



كود PHP:

<?
/* استخدم الكلاس المفتوح المصدر */
require_once 'Cache/Lite.php';
/* ادراج ملف الكونفج */
require_once 'CacheConfig.php';

class 
CacheSite{
  var 
$config;
  var 
$id;
  var 
$Cache_Lite;
  var 
$createNewCache true;

/* الفنكسن الرأيسي */
  
function CacheSite($configSettings){
/* استخدام اي دي  مختلف لكل صفحه */  
  
$this->id str_replace(array('/','\\','?','='),'_','ID'.$_SERVER['PHP_SELF']);
    
$this->config $configSettings;

/* استحدام ملف الكونفج */
$this->Cache_Lite = new Cache_Lite($this->config);

/* اذا كانت هناك نسخه قديمه ولم ينتهي صلاحيته .. اطبعها واوقف البرنامج .. */
    
if ($data $this->Cache_Lite->get($this->id)) {
      
$this->createNewCache false;
      echo 
$data;
      exit();
    } else {
      
ob_start();
    }
  }


/* عندما ينتهي عمل البرنامج .. هذا الفنكسن سيعمل اوتوماتيكيا */
function __destruct(){
    if(
$this->createNewCache){
      
$data ob_get_contents();

/* ضع الناتج في ملف على مجلد معروف عن طريق الكونفج */
      
$this->Cache_Lite->save($data$this->id);
      
ob_get_clean();
      echo 
$data;
    }
  }

}

$cacheObject = new CacheSite($cacheConfig);
?>
ملف الكونفج: طبعا قم بتغير ما يلزم .. لان مكان الcacheDir هو المكان الخاص على جهازي
كود PHP:
<?
$cacheConfig 
= array(
  
'cacheDir' => '/home/khalid/Sites/docs/test/cache/'// المجل الموجود فيه الكاش
  
'lifeTime' => '100'// عدد الثواني الى تاريخ انتهاء الكاش
);
?>
وطريقه الاستخدام سهله، قم فقط بوضع السطر التالي في بدايه الملف اللذي تود ان تفعل كاش به
كود PHP:
require_once './cacheClass.php'
سهله صح؟
حملوا الملفات المرافقه اذا اردتم الملفات كلها.






الملفات المرفقة
نوع الملف: zip cacheTut.zip‏ (1.6 كيلوبايت, المشاهدات 8)
__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو
hilaby غير متواجد حالياً   قديم 25-06-2008, 09:00 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#21 (permalink)  

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

سؤال للأستاذ daif بما أنه لديه خبرة في الـ cache والمطبقة في برمجية القالب السهل ، ما أود معرفته هو كيف يقوم القالب بمعرفة أنه قد حصل تحديث ما على قاعدة البيانات ؟ ، لقد فهمت الطريقة المبنية على التحقق من وقت تعديل الملف ، ولكنها لا تصلح الا اذا كان لدي ملفين ثابتين أو ملف واحد ووقت اقوم بتحديده ، في القالب السهل لا يتم تحديد الوقت ( حسب تجربتي ) بل يتم تحديث ملفات الـ cache عند حدوث تغيير في قاعدة البيانات ، قد يكون هذا الكلام خاطئاً فلست واثقاً منه إنما أظن ذلك . أتمنى من الأستاذ daif التوضيح بشيء من التفصيل .

بالمناسبة .. لازلت مهتما بتحويل الإستعلام في أول رد في الموضوع إلى إستعلام بطريقة join .

شكراً لكم جميعاً






dev11 غير متواجد حالياً   قديم 26-06-2008, 02:19 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#22 (permalink)  

نسيت أن أشكرك على الـ class الذي وضعته ، جميل بالفعل وإستخدام موفق للخاصية __destruct ، شكراً لك مرة أخرى .

بالمناسبة وبما أنك تطرقت للـ pear ، فإنني لا أزال أواجه مشاكل في تنصيبها ، خصوصاً أنني مضطر لإستخدام نظام الـ windows حالياً







التعديل الأخير تم بواسطة : dev11 بتاريخ 26-06-2008 الساعة 03:02 AM.
dev11 غير متواجد حالياً   قديم 26-06-2008, 03:00 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#23 (permalink)  

قمت بقراءة الـ class الذي قمت بوضعه مرة أخرى ، حقيقةً أرى لمسة جمالية رائعة وفكر عالي في هذا الـ class ، شكراً لك مرة أخرى






dev11 غير متواجد حالياً   قديم 26-06-2008, 03:07 AM
رد مع اقتباس
عضو نشيط جدا
تاريخ التسجيل: May 2007-
#24 (permalink)  

نقطة أخرى .. عند تنفيذ الأمر exit هل سيتم تنفيذ الدالة __destruct أم لا ؟






dev11 غير متواجد حالياً   قديم 27-06-2008, 11:52 PM
رد مع اقتباس
Moderator
تاريخ التسجيل: Aug 2004-
#25 (permalink)  

السلام الاخ dev11
الاجابه لسؤالك .. نعم ..
الشرح:
الامر exit يقف عمل البرنامج وبذالك يبدأ بتنفيذ عمليات مسح المساحه المستخدمه من الذاكره، فلذالك سيعمل ال destruct__






__________________
هلابي افضل المواقع العربية تصميماً
انصح باستخدام ابونتو
hilaby غير متواجد حالياً   قديم 28-06-2008, 09:26 PM
رد مع اقتباس
رد