אירוח ופיתוח האתר נתרמו באדיבות...
- לינווייט - תשתיות תוכן וקהילה
- אמנון לבב - לבבי מדריכים
באתר שתיל יש דף אחד ענק, שהוא View, שהוא הכי פופולארי באתר ומתעדכן פעם ביום.
http://shatil.org.il/modaot/joboffer_lastweek
אין שום סיבה שכל פעם שניגשים אליו (עד 4,000 צפיות ביום!) תתבצע השאילתא הכבדה.
אני יודע שיש מודול בשם Block Cache שאותו אני כבר מפעיל במקומות אחרים באתר.
האם יש דרך להכניס view לתוך בלוק ואז להציג את הגירסה השמורה שלו?
או לחלופין, האם יש דרך "לשמור" תוצאות של view ?
תודה,
חנן כהן
נ.ב. לחוכמולוגים: הכתובת שלמעלה היא למעשה node טקסט סטטי שלתוכו אני מעתיק פעם ביום את תוכן ה view לאחר עדכון האתר. מה שאני מנסה לעשות זה למנוע את העבודה הידנית הזאת.
לגבי הכנסת view לתוך בלוק
כן, אתה יכול להגדיר בלוק בצורה תכנותית (hook_block) ובבלוק לקרוא ל- view ספציפי.
לא התנסיתי עם block cache אבל יכול להיות שהוא יעשה cache לבלוק, ול- view באופן עקיף, וישיג לך את המבוקש.
בועז
בעניין: cache של view
גם ל-views יש cache על התוצאות.
מה שאתה יכול לעשות הוא להגדיל את הזמן המינימלי לשמירת ה-cache (תחת ניהול -> ביצועים). מהו הערך שיש שם כרגע?
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות
פתרון לדוגמא
תחליף את ה node הסטטי שלך בקוד הזה:
<?phpif (($cache = cache_get('mysite_myview')) && !empty($cache->data)) {
$output = unserialize($cache->data);
}
else {
$output = theme('view', 'myview');
cache_set('mysite_myview', 'cache', serialize($output), time() + 3600*24);
}
print $output;
?>
החלף את myview ב view שלך, ושים את שם האתר במקום mysite.
אל תשכח לסמן פילטר PHP על ה node הזה.
(לא בדקתי את הקוד)
בעניין: פתרון לדוגמא
זה מה שה-cache הפנימי של VIEWS אמור לעשות. אתה בעצם מציע תוספת ל-cache ה"כללי".
במקרה הזה נראה לי שזו כפילות.
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות
לא מדויק.
ה cache הפנימי שומר את השאילתא ולא את התוצאות ככל הידוע לי. גם אם כן היה שומר את התוצאות, הוא חייב לתת תוצאות עדכניות, שלא הכרחיות במקרה זה.
כמו כן, גם אם אפילו תוצאות השאילתא נשמרות, גם רינדור לוקח זמן.
קטע הקוד שנתתי אמור להתנהג בדיוק כמו עמוד סטטי שמתעדכן פעם ביום, כך שהוא פתרון טוב לדעתי במקרה זה.
בעניין: לא מדויק.
ובכן... VIEWS באמת שומר מספר נתונים בזכרון מטמון, שהם כל הנתונים שהוא צריך לדעת על מרכיבי ה-VIEWS השונים, על מנת להרכיב אותם מהר יותר.
מה לגבי זכרון המטמון הרגיל - האם הוא לא אמור להחזיק את הדף המרונדר (למשתמשים אנונימיים כמובן)? הפתרון שאני חותר אליו הוא כזה שלא מצריך קוד, אלא מסתפק ב-UI. במקרה כזה ניתן פשוט להגדיל את משך החיים של המטמון ולהשיג כך את התוצאה הרצויה.
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות
נכון
זכרון המטמון הרגיל יחזיק את הדף המרונדר, ויחזיר אותו עוד לפני שייכנס למערכת הסבוכה של דרופל (page cache).
השאלה היא אם מתאים לאתר הזה להפעיל מטמון כללי של 24 שעות, היא שאלה לשאול את חנן. אני לא יודע את התשובה אליה, ולכן תשובתי היתה נקודתית.
אני מסכים שכדאי קודם לנסות את האפשרות הכללית אם היא קבילה, ורק אם לא אז לכתוב קוד.
כל אחת מהאפשרויות עדיפה על הפתרון הנהוג היום של העתקה והדבקה.. :)
תודה ושאלה לגבי mysite
במסך admin/settings/site-information
רשום בשם האתר "שתיל".
האם זה mysite ?
או ש mysite הוא פרמטר אחר?
תודה.
סתם משהו ייחודי
זה לא משנה מה תכתוב שם, כל עוד הוא ייחודי.
במקרה שלך אתה יכול לכתוב shatil, בהנחה שאין לך מודול בשם זה.
הנקודה היא שזה המזהה של המטמון. אם מודול אחר ישתמש באותו מזהה, הם יכולים להפריע אחד לשני.
אתה תותח!
עבד במכה הראשונה.
עכשיו אני רוצה להבין לגבי בדיקה שזה עושה את מה שזה אמור לעשות.
אם אני מאשר עכשיו מודעה חדשה, היא לא אמורה להופיע בדף, נכון?
היא אמורה להופיע רק בעוד 24 שעות, הלא כן?
שוב תודה!
בעקרון נכון, אבל
אני לא בטוח איך ה cache הזה מתנקה. אם זה לא קורה לבד, זה אולי יקרה בהרצת cron הבאה, או בניקוי cache ידני (למשל בעזרת devel.module).
אם אתה רואה שזה לא מסתדר לבד אחרי 24 שעות, תוסיף קריאה ל cache_clear_all() בתחילת קטע הקוד.
אשמח אם תספר איך זה עבד בסוף.
סבבה!
נוצרה השורה הבאה בטבלאת cache
shatil_modaot_job_offer_lastweek_dyn [BLOB - 227.7 KiB] 1207209973 1207123573
אישרתי עכשיו כמה מודעות חדשות והן לא הופיעו בדף
נראה מה יהיה מחר בבוקר.
בעניין: בעקרון נכון, אבל
views מנקה את ה-cache שלו בכל מיני הזדמנויות: בפעולות על תפריטים, טקסונומי, פרופיל משתמש.
לא מצאתי בקוד המודול שימוש ב-cron על מנת לנקות את ה-cache. כפי שראינו, בדרופל 6 קיימת אפשרות לנקות את כל טבלאות הקאש בעת קריאה ל-cache_clear_all, אבל לא בדרופל 5. בדרופל 5 הקריאה תנקה את טבלת cache_page ולא את טבלת cache_views.
בנוסף, אני לא בטוח שמקרה הספציפי הזה, אם כבר נכנסנו לקוד, שיהיה נכון לנקות את כל טבלת ה-cache של Views באותה הזדמנות. תוכל לנקות את השורה הזו ע"י שימוש ב:
<?phpcache_clear_all(NULL, 'cache_views');
?>
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות
תיקון
לפי הדוגמה של יובל, השורה צריכה להיות:
<?phpcache_clear_all(NULL, 'cache');
?>
זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות