בעיקר כי זה מעניין
הרעיון הוא לבצע עדכון בUI ברגע שיש עדכון במערכת, עכשיו יש דרך טובה והגיונית לעשות את זה, ויש את הדרך הפשוטה, שזה באמת לבצע כל פעם בקשה לשרת להביא את כל התוכן ולעדכן אותו גם אם אין שינוי, אני בעד הדרך הטובה והחכמה!
1.בוא נדמיין שיש לנו טבלה במסד נתונים שנקראת songs והיא מכילה מספר שדות:
song_id
song_title
song_author
song_lyrics
אתה מעדכן אותה המון, ומכניס אליה כל הזמן נתונים.
עכשיו בוא נדמיין את הדרך הלא טובה של לעשות עדכון לייב לנתונים מהטבלה:
כל 30 שניות אתה ניגש לטבלה שולף את כל הנתונים, ומחזיר HTML ופשוט מעדכן את הUI, לא טוב!
קודם כל כל פעם אתה ניגש מבצע פעולה על הדטאבייס של קריאה ממנו, כל פעם אתה מחזיר JUNK ענקי של HTML, כל פעם אתה מעדכן את הUI שלך במידע שיכול להיות כבר קיים.
הדרך שאני מציע כוללת בתוכה מספר שלבים:
1.עבודה עם Cache Module בPHP יש כמה כאלה, אם אתה לא מתעסק עם המון המון נתונים אז APC מספיק טוב.
2.חלוקת תפקידים בין הserver לclient אתה תבקש מידע מה-server ואת הUI אתה תבנה בצד הלקוח, לא מערבבים חלב ובשר.
3.לפני כל עדכון בUI אתה תוודא שבכלל יש מה לעדכן.
אז איך אנחנו עושים את זה?
קודם כל בכל רגע נתון אנחנו נחזיק בצד הלקוח את כל ה"שורות" שאנחנו מציגים שאני אומר כל ה"שורות" זה לא אומר בהכרח את כל המידע שלהם, מערך/אובייקט שיחזיק את הid של כל שורה יהיה מספיק טוב, עכשיו בכל עליה מחדש של העמוד שמציג את המידע שלנו, אנחנו נצטרך לייצר את המערך/אובייקט מחדש, שזה בסדר, גם ככה בעליה מחדש של העמוד אנחנו טוענים הכל מהDB כי אנחנו רוצים להיות מעודכנים תמיד!
השלב הבא הוא איך בעצם אנחנו יכולים לדאוג שכל מי שמסתכל על הUI ייקבל עדכון במידת הצורך, ולא יווצר מצב שרק חלק מהמשתמשים ייקבלו את העדכון?
בכל פעם שיש עדכון בשרת, אתה רוצה לסמן את העדכון הספציפי הזה למשך X זמן כדי שכולם יוכלו לקבל אותו, בגלל שאנחנו לא יודעים כמה זמן ייקח לכל משתמש לבצע את הבקשת AJAX לשרת, אנחנו צריכים לתת grace time למשתמש.
פה נכנס המנגנון APC שלנו אנחנו יכולים ליצור בdata store שלנו ערך לזמן מוגבל, אז בוא נעשה דבר כזה, כל פעם שאנחנו מבצעים עדכון בדטאבייס, אנחנו שומרים את הlast insert id בתוך הcache למשך 10 דקות, כמובן שאם במשך ה10 דקות נכנסים עוד עדכונים, אז אנחנו ממשיכים לייצר מידע בתוך הcache שכולו יוחזק ל10 דקות, אם המערכת שלך מתעדכנת באופן מאסיבי, הייתי מוריד את הזמן לפחות מ5 דקות או עובר למנגנון CACHE חזק יותר.
עכשיו מעבר להחזקה של המידע בCACHE אנחנו גם צריכים להחזיק מספר כל שהוא שייסמן את הגירסא האחרונה בcache נקרא למפתח הזה cache_version.
כל בקשה לעדכון שהclient עושה אתה מבחינתך תמיד מחזיר לו את הcache_version.
עכשיו אתה צריך לבצע בדיקה:
נניח הגירסא האחרונה שיש אצלך היא 3.5.2
וקיבלת גירסא מס' 3.5.6
משמע יש עדכון!
אתה שולח בקשה נוספת להביא את המידע האמיתי.
עכשיו הcache_data שאנחנו שומרים מחזיק סה"כ את הid שעדכנו לא את הנתונים האמיתיים, אבל פה החלק המגניב, אנחנו נשלוף אך ורק את המידע שאנחנו צריכים, שום דבר מעבר לזה!
אז אנחנו שולפים את המידע מחזירים אותו חזרה לclient בונים את מה שצריך לבנות בHTML ומעדכנים כמובן כל הזמן בclient את הגירסאת cache האחרונה שלנו, כדי שנהיה תמיד מסונכרנים!
וככה המנגנון שלנו תמיד נשאר מעודכן, אלא אם כן פיספסתי משהו
רעיונות לשיפור, מוזמנים בכיף, חשבתי על זה תוך כדי שכתבתי! אולי שווה לכתוב מערכת בPHP/JS שמנהלת משהו כזה