שיפור ביצועי המערכת ================== ביצועי אפליקצית ווב מושפעים על ידי גורמים רבים. גישה למסד נתונים, פעולות הקשורות לקבצים, תעבורת שרת כל אלו הם גורמים פוטנציאלים. Yii מנסה בכל ההיבטים להוריד את ההשפעה על ביצועי האפליקציה הנגרמים על ידי הפריימוורק. אך עדיין, ישנם המון מקומות באפליקצית המשתמש שניתן לשפר בכדי להעצים את ביצועי המערכת. הפעלת תוסף APC ---------------------- הפעלת התוסף [APC](http://www.php.net/manual/en/book.apc.php) בשרת היא כנראה הדרך הקלה ביותר לשיפור הביצועים של אפליקציה. התוסף מבצע אופטימיזציה של קוד ה PHP ושומר אותו במטמון ובכך מונע את הזמן הדרוש לעיבוד קוד ה PHP עבור כל בקשה נכנסת. כיבוי אפשרות ניפוי השגיאות -------------------- כיבוי אפשרות ניפוי השגיאות הינה דרך קלה נוספת לשיפור הביצועים. אפליקציה רצה במצב של ניפוי שגיאות במידה והמשתנה הקבוע `YII_DEBUG` מוגדר כ true. מצב ניפוי שגיאות הינו שימוש בזמן תהליך הפיתוח, אך זה ישפיע לרעה על ביצועי האפליקציה מאחר וכמה רכיבים גורמים לנטל נוסף במצב של ניפוי שגיאות. לדוגמא, מערכת התיעודים במערכת שומרת תיעודים נוספים עבור כל הודעה הנשמרת בתיעוד במצב של ניפוי שגיאות. שימוש ב `yiilite.php` ------------------- במידה והתוסף [APC](http://www.php.net/manual/en/book.apc.php) מופעל, אנו יכולים להחליף את הקובץ `yii.php` בקובץ הרצה ראשוני אחר בשם `yiilite.php` בכדי לשפר אף יותר את ביצועי האפליקציה הרצה על גבי מערכת ה Yii. הקובץ `yiilite.php` מגיע עם כל גרסא של Yii. קובץ זה הוא התוצאה של איחוד כמה מחלקות נפוצות לקובץ אחת. ההערות והודעות התיעוד הוסרו מקובץ מאוחד זה. לכן, שימוש ב `yiilite.php` יקטין את מספר הקבצים המתווספים במהלך הרצת האפליקציה וימנע הרצה של פקודות המתעדות פעולות את הפעולות הנעשות באפליקציה. » Note|הערה: שימוש ב `yiilite.php` ללא APC יכול למעשה להשפיע על ביצועי המערכת **לרעה**, מאחר ו `yiilite.php` מכיל מחלקות שלמעשה לא משומשות בכל בקשה ויהיה צורך בזמן עיבוד נוסף ומיותר. כמו כן, נראו מקרים בהם השימוש ב `yiilite.php` אובחן להיות איטי יותר בהגדרות שונות על שרתים שונים, גם כשהתוסף APC מופעל. הדרך הטובה ביותר לשפוט במידה וכדאי להשתמש ב `yiilite.php` או לא היא על ידי הרצת בדיקת עומס על גבי הדוגמא של `hello world` המצורפת למערכת. שימוש בטכניקות מטמון ------------------------ כפי שמדובר בחלק אודות [מטמון](/doc/guide/caching.overview), Yii מספק פתרונות מטמון שונים שיכולים לשפר את הביצועים של האפליקציה בצורה משמעותית. במידה ויצירת תוכן מסויים דורש זמן רב, אנו יכולים להשתמש בגישה של [מטמון נתונים](/doc/guide/caching.data) בכדי להפחית את תדירות יצירת הנתונים; במידה וחלק מהעמוד נשאר סטטי, אנו יכולים להשתמש [במטמון בחלקים](/doc/guide/caching.fragment) בכדי להפחית את תדירות עיבוד התצוגה; במידה וכל העמוד נשאר סטטי, אנו יכולים להשתמש [במטמון עמודים](/doc/guide/caching.page) בכדי להפחית ולחסוך בתדירות עיבוד התצוגה של העמוד כולו. במידה והאפליקציה משתמשת ב [Active Record](/doc/guide/database.ar), אנו יכולים להפעיל את המטמון עבור תרשים מסד הנתונים בכדי לשמור את התרשים (שבדרך כלל לא משתנה) במטמון ולחסוך את זמן עיבוד תרשים מסד הנתונים בכל בקשה. ניתן לבצע זאת על ידי הגדרת המאפיין [CDbConnection::schemaCachingDuration] לערך הגדול מ 0. מלבד שיטות המטמון שהצגנו כרגע שהם ברמת האפליקציה, אנו יכולים להשתמש במטמון ברמת השרת בכדי להאיץ את האפליקציה עוד יותר. בעצם, התוסף [APC](/doc/guide/topics.performance#enabling-apc-extension) שתארנו לגביו קודם לכן שייך לקטגוריה זו. ישנם עוד שיטות לשימוש במטמון בצד השרת כמו, [Zend Optimizer](http://Zend.com/ZendOptimizer), [eAccelerator](http://eaccelerator.net/), [Squid](http://www.squid-cache.org/) ואחרים. אופטימיזצית מסד הנתונים --------------------- שליפת מידע ממסד נתונים הוא בדרך כלל צוואר הבקבוק באפליקצית ווב. למרות ששימוש במטמון יכול להקל על הפגיעה בביצועים, זה אינו פותר את הבעיה לחלוטין. ברגע שמסד הנתונים מכיל כמות עצומה של נתונים והתוכן השמור במטמון תוקפו פג ויש לחדשו, שליפת הנתונים האחרונים ממסד הנתונים יכול לקחת זמן רב ללא עיצוב נכון של מסד הנתונים והשאילתה. יש לעצב את האינדקסים במסד הנתונים בצורה נבונה. אינדוקס יכול לזרז שאילתות `SELECT` בצורה משמעותית, אך זה יכול להאט שאילתות `INSERT` , `UPDATE`, או `DELETE`. עבור שאילתות מורכבות, מומלץ ליצור טבלת VIEW במסד הנתונים במקום לבצע את השאילתות בקוד ה PHP ולבקש מה DBMS (מסד הנתונים) לעבד אותם שוב ושוב. אין להשתמש יותר מדי ב [Active Record](/doc/guide/database.ar). למרות ש [Active Record](/doc/guide/database.ar) הוא שימוש בעיצוב הנתונים באופן מונחה עצמים (OOP), הוא למעשה פוגע לרעה בביצועי המערכת מאחר והוא יוצר אובייקט אחד או יותר המייצג כל שורה בתוצאות השאילתה. עבור אפליקציות המכילות מידע רב, שימוש ב [DAO](/doc/guide/database.dao) או API של מסדי נתונים ברמה נמוכה יותר יכולה להיות בחירה טובה יותר. לבסוף, יש להשתמש ב `LIMIT` בשאילתות `SELECT`. זה מונע שליפה אדירה של נתונים בבת אחת ממסד הנתונים ובזבוז זכרון המערכת המוקצה ל PHP. צמצום מספר קבצי ספריט ----------------------- עמודים מורכבים בדרך כלל צריכים לכלול הרבה קבצי JS ו CSS חיצוניים. מאחר וכל קובץ נוסף יגרום לבקשה הלוך חזור לשרת, אנו צריכים לצמצם את מספר קבצי הסקריפט החיצוניים על ידי איחוד של כולם לקובץ אחד. אנו גם צריכים לשקול להקטין את גודל כל קובץ בכדי להפחית מהזמן הנדרש לשלוח ולקבלו מהשרת. ישנם כלים רבים מסביב שיכולים לעזור בשני היטבים אלו. עבור עמוד הנוצר על ידי Yii, סביר להניח שישנם קבצי סקריפט המוצגים על ידי רכיבים שאנו לא רוצים לערוך (לדוגמא, רכיבים בסיסיים במערכת ה Yii, רכיבי צד-שלישי). בכדי לצמצם את מספר קבצי הסקריפט הללו, אנו צריכים לבצע שני דברים. » Note|הערה: האפשרות של `scriptMap` שאנו נתאר בחלק הבא קיימת החל מגרסא 1.0.3. קודם כל, אנו מגדירים את הסקריפטים שאנו רוצים לצמצם על ידי הגדרת המאפיין [scriptMap|CClientScript::scriptMap] של רכיב המחלקה [clientScript|CWebApplication::clientScript]. ניתן לבצע זאת בהגדרות האפליקציה או בקוד. לדוגמא, ~~~ [php] $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](http://code.google.com/apis/ajaxlibs/). לדוגמא, אנו יכולים לצרף את `jquery.js` מהשרתים של Google במקום לצרף את אותו הקובץ מהשרתים שלנו. בכדי לעשות זאת, אנו קודם צריכים להגדיר את המאפיין `scriptMap` בצורה הבאה, ~~~ [php] $cs=Yii::app()-»clientScript; $cs-»scriptMap=array( 'jquery.js'=»false, 'jquery.ajaxqueue.js'=»false, 'jquery.metadata.js'=»false, ...... ); ~~~ על ידי מיפוי קבצים אלו ל false, אנו מונעים מ Yii מליצור את הקוד המצרף קבצים אלו. במקום, אנו כותבים את הקוד הבא בעמודים שלנו בכדי לצרף את הסקריפטים אחד אחד מהשרתים של Google, ~~~ [php] «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» ~~~ «div class="revision"»$Id: topics.performance.txt 1622 2009-12-26 20:56:05Z qiang.xue $«/div»