0 follower

שיפור ביצועי המערכת

ביצועי אפליקצית ווב מושפעים על ידי גורמים רבים. גישה למסד נתונים, פעולות הקשורות לקבצים, תעבורת שרת כל אלו הם גורמים פוטנציאלים. Yii מנסה בכל ההיבטים להוריד את ההשפעה על ביצועי האפליקציה הנגרמים על ידי הפריימוורק. אך עדיין, ישנם המון מקומות באפליקצית המשתמש שניתן לשפר בכדי להעצים את ביצועי המערכת.

1. הפעלת תוסף APC

הפעלת התוסף APC בשרת היא כנראה הדרך הקלה ביותר לשיפור הביצועים של אפליקציה. התוסף מבצע אופטימיזציה של קוד ה PHP ושומר אותו במטמון ובכך מונע את הזמן הדרוש לעיבוד קוד ה PHP עבור כל בקשה נכנסת.

2. כיבוי אפשרות ניפוי השגיאות

כיבוי אפשרות ניפוי השגיאות הינה דרך קלה נוספת לשיפור הביצועים. אפליקציה רצה במצב של ניפוי שגיאות במידה והמשתנה הקבוע YII_DEBUG מוגדר כ true. מצב ניפוי שגיאות הינו שימוש בזמן תהליך הפיתוח, אך זה ישפיע לרעה על ביצועי האפליקציה מאחר וכמה רכיבים גורמים לנטל נוסף במצב של ניפוי שגיאות. לדוגמא, מערכת התיעודים במערכת שומרת תיעודים נוספים עבור כל הודעה הנשמרת בתיעוד במצב של ניפוי שגיאות.

3. שימוש ב yiilite.php

במידה והתוסף APC מופעל, אנו יכולים להחליף את הקובץ yii.php בקובץ הרצה ראשוני אחר בשם yiilite.php בכדי לשפר אף יותר את ביצועי האפליקציה הרצה על גבי מערכת ה Yii.

הקובץ yiilite.php מגיע עם כל גרסא של Yii. קובץ זה הוא התוצאה של איחוד כמה מחלקות נפוצות לקובץ אחת. ההערות והודעות התיעוד הוסרו מקובץ מאוחד זה. לכן, שימוש ב yiilite.php יקטין את מספר הקבצים המתווספים במהלך הרצת האפליקציה וימנע הרצה של פקודות המתעדות פעולות את הפעולות הנעשות באפליקציה.

» Note|הערה: שימוש ב yiilite.php ללא APC יכול למעשה להשפיע על ביצועי המערכת לרעה, מאחר ו yiilite.php מכיל מחלקות שלמעשה לא משומשות בכל בקשה ויהיה צורך בזמן עיבוד נוסף ומיותר. כמו כן, נראו מקרים בהם השימוש ב yiilite.php אובחן להיות איטי יותר בהגדרות שונות על שרתים שונים, גם כשהתוסף APC מופעל. הדרך הטובה ביותר לשפוט במידה וכדאי להשתמש ב yiilite.php או לא היא על ידי הרצת בדיקת עומס על גבי הדוגמא של hello world המצורפת למערכת.

4. שימוש בטכניקות מטמון

כפי שמדובר בחלק אודות מטמון, Yii מספק פתרונות מטמון שונים שיכולים לשפר את הביצועים של האפליקציה בצורה משמעותית. במידה ויצירת תוכן מסויים דורש זמן רב, אנו יכולים להשתמש בגישה של מטמון נתונים בכדי להפחית את תדירות יצירת הנתונים; במידה וחלק מהעמוד נשאר סטטי, אנו יכולים להשתמש במטמון בחלקים בכדי להפחית את תדירות עיבוד התצוגה; במידה וכל העמוד נשאר סטטי, אנו יכולים להשתמש במטמון עמודים בכדי להפחית ולחסוך בתדירות עיבוד התצוגה של העמוד כולו.

במידה והאפליקציה משתמשת ב Active Record, אנו יכולים להפעיל את המטמון עבור תרשים מסד הנתונים בכדי לשמור את התרשים (שבדרך כלל לא משתנה) במטמון ולחסוך את זמן עיבוד תרשים מסד הנתונים בכל בקשה. ניתן לבצע זאת על ידי הגדרת המאפיין CDbConnection::schemaCachingDuration לערך הגדול מ 0.

מלבד שיטות המטמון שהצגנו כרגע שהם ברמת האפליקציה, אנו יכולים להשתמש במטמון ברמת השרת בכדי להאיץ את האפליקציה עוד יותר. בעצם, התוסף APC שתארנו לגביו קודם לכן שייך לקטגוריה זו. ישנם עוד שיטות לשימוש במטמון בצד השרת כמו, Zend Optimizer, eAccelerator, Squid ואחרים.

5. אופטימיזצית מסד הנתונים

שליפת מידע ממסד נתונים הוא בדרך כלל צוואר הבקבוק באפליקצית ווב. למרות ששימוש במטמון יכול להקל על הפגיעה בביצועים, זה אינו פותר את הבעיה לחלוטין. ברגע שמסד הנתונים מכיל כמות עצומה של נתונים והתוכן השמור במטמון תוקפו פג ויש לחדשו, שליפת הנתונים האחרונים ממסד הנתונים יכול לקחת זמן רב ללא עיצוב נכון של מסד הנתונים והשאילתה.

יש לעצב את האינדקסים במסד הנתונים בצורה נבונה. אינדוקס יכול לזרז שאילתות SELECT בצורה משמעותית, אך זה יכול להאט שאילתות INSERT , UPDATE, או DELETE.

עבור שאילתות מורכבות, מומלץ ליצור טבלת VIEW במסד הנתונים במקום לבצע את השאילתות בקוד ה PHP ולבקש מה DBMS (מסד הנתונים) לעבד אותם שוב ושוב.

אין להשתמש יותר מדי ב Active Record. למרות ש Active Record הוא שימוש בעיצוב הנתונים באופן מונחה עצמים (OOP), הוא למעשה פוגע לרעה בביצועי המערכת מאחר והוא יוצר אובייקט אחד או יותר המייצג כל שורה בתוצאות השאילתה. עבור אפליקציות המכילות מידע רב, שימוש ב DAO או API של מסדי נתונים ברמה נמוכה יותר יכולה להיות בחירה טובה יותר.

לבסוף, יש להשתמש ב LIMIT בשאילתות SELECT. זה מונע שליפה אדירה של נתונים בבת אחת ממסד הנתונים ובזבוז זכרון המערכת המוקצה ל PHP.

6. צמצום מספר קבצי ספריט

עמודים מורכבים בדרך כלל צריכים לכלול הרבה קבצי JS ו CSS חיצוניים. מאחר וכל קובץ נוסף יגרום לבקשה הלוך חזור לשרת, אנו צריכים לצמצם את מספר קבצי הסקריפט החיצוניים על ידי איחוד של כולם לקובץ אחד. אנו גם צריכים לשקול להקטין את גודל כל קובץ בכדי להפחית מהזמן הנדרש לשלוח ולקבלו מהשרת. ישנם כלים רבים מסביב שיכולים לעזור בשני היטבים אלו.

עבור עמוד הנוצר על ידי Yii, סביר להניח שישנם קבצי סקריפט המוצגים על ידי רכיבים שאנו לא רוצים לערוך (לדוגמא, רכיבים בסיסיים במערכת ה Yii, רכיבי צד-שלישי). בכדי לצמצם את מספר קבצי הסקריפט הללו, אנו צריכים לבצע שני דברים.

» Note|הערה: האפשרות של scriptMap שאנו נתאר בחלק הבא קיימת החל מגרסא 1.0.3.

קודם כל, אנו מגדירים את הסקריפטים שאנו רוצים לצמצם על ידי הגדרת המאפיין scriptMap של רכיב המחלקה clientScript. ניתן לבצע זאת בהגדרות האפליקציה או בקוד. לדוגמא,

$cs=Yii::app()-»clientScript;
$cs-»scriptMap=array(
    'jquery.js'=»'/js/all.js',
    'jquery.ajaxqueue.js'=»'/js/all.js',
    'jquery.metadata.js'=»'/js/all.js',
    ......
);

מה שהקוד למעלה עושה הוא ממפה את קבצי הסקריפט הרשומים למעלה לקישור js/all.js/. במידה ואחד מקבצי הסקריפט הרשומים למעלה יצורף על ידי רכיב כלשהו, Yii יצרף את הקישור (פעם אחת) במקום את הקישור של כל אחד מהסקריפטים.

שנית, אנו צריכים להשתמש בכלי כלשהו לאיחוד (ואולי גם כיווץ התוכן) קבצי הסקריפט לקובץ סקריפט אחד ולשמור אותו כ js/all.js.

» Note|הערה: יש לבצע את האיחוד והכיווץ ידנית, נכון לעכשיו Yii לא מאפשרת לעשות זאת תחת הרכיבים שלה.

אפשרות זו ניתנת לביצוע גם על גבי קבצי CSS.

כמו כן אנו יכולים לשפר את מהירות טעינת העמוד בעזרת Google AJAX Libraries API. לדוגמא, אנו יכולים לצרף את jquery.js מהשרתים של Google במקום לצרף את אותו הקובץ מהשרתים שלנו. בכדי לעשות זאת, אנו קודם צריכים להגדיר את המאפיין scriptMap בצורה הבאה,

$cs=Yii::app()-»clientScript;
$cs-»scriptMap=array(
    'jquery.js'=»false,
    'jquery.ajaxqueue.js'=»false,
    'jquery.metadata.js'=»false,
    ......
);

על ידי מיפוי קבצים אלו ל false, אנו מונעים מ Yii מליצור את הקוד המצרף קבצים אלו. במקום, אנו כותבים את הקוד הבא בעמודים שלנו בכדי לצרף את הסקריפטים אחד אחד מהשרתים של Google,

«head»
«?php echo CGoogleApi::init(); ?»
 
«?php echo CHtml::script(
    CGoogleApi::load('jquery','1.3.2') . "\n" .
    CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
    CGoogleApi::load('jquery.metadata.js')
); ?»
......
«/head»

Found a typo or you think this page needs improvement?
Edit it on github !