עם הזמן מתאספים אצלי טיפים לביצועים בPHP. נאגרים, משומשים, משתפרים, משתנים. מדי פעם מגיע טריגר מבחוץ, כמו מקבץ הטריקים לשיפור PHP הזה שגורם לי לרצות לכתוב, לתרגם ולתת את חוות הדעת האישית שלי על חלק מהדברים. הטיפים האלה הם ברמת התוכנה בלבד (יש עוד כמה ברמת מוצרים כמו php accelerator/optimizers למיניהם, עדכוני מערכת, שיפורי גישה לדיסק וזכרון וכו).
שימוש במנגנון מטמון cache:
שימוש המודולים למטמון ()cache, כמו Memcache, או שפת תבניות שתומכת במטמון (כמו Smarty) יכולה לשפר את הביצועים של האתר בקלות.
המשפט נכון אבל טומן כמה מלכודות קטנות ששוה לחשוב עליהן. דבר ראשון כשיש בעיית ביצועים צריך להבין מהיכן היא מגיעה. מהו הצינור התקוע שלכם. האם זו מהירות השרת (CPU?), זכרון? גישה לדיסק איטית? וכו. ברוב השרתים הקטנים והזולים הבעיה היא דווקא הזכרון. במקרים כאלה, Memcache ודומיו פשוט יהרגו אתכם לגמרי.
בקשר לSmrty, אני עדיין בודק, ולא החלטתי אם זה עוזר או לא. הביצועין של הערכת בעייתים, ויש הטוענים שאין טעם להשתמש בשפת סקריפטים על שפת סקריפטים (משום שPHP עצמה היא סקריפט). יש הגיון. שימוש במטמון של Smarty בצורה טובה חוסך בביצועים, אבל פוגע בדיסק (האם הגודל מוגבל אצלכם? האם הגישה לדיסק בסדר?) וצריך לשים לב לכך במיוחד באתרים קטנים.
לא להעתיק משתנים ללא סיבה:
הכתבה מדברת על מתכנתים שמעתיקים משתני קריאה למשתנים מקומיים בשביל הנוחות, דבר שגורם להקצאת משאבים (זכרון) כפולה וזמן פעולה ארוך יותר (עומס על השרת). אם משתני הקריאה גדולים במיוחד, אם לדוגמא משתמש מנסה להרוג את השרת שלכם, ושולח הודעות של חצי מגה, אז אתם באמת בצרה.
דוגמא רעה:
$description = $_POST['description'];
echo $description;
דוגמא טובה:
echo $_POST['description'];
הנקודה כאן נכונה, בגדול, וצריך לקחת אותה בחשבון. יש לי שתי הערות חשובות: אבטחת מידע וביצועים. מכיוון שמשתנה שמגיע מצד הלקוח תמיד, אבל תמיד חייב להבדק לתקינות, נכונות וכדומה, והפעולה הזו יכולה להיות יקרה (במיוחד אם הטקסט גדול), כדאי לבצע את הבדיקה פעם אחת, לשמור את התוצאה בצד ולהמשיך משם. עדיין ייתכן ביזבוז זכרון, אבל לא ביצועים ולא זמן, משום שההעתקה מתרחשת בכל מקרה. הדבר הנוסף הוא שאם נגשים למשתנה שוב שוב, לעיתים עדיף להעתיק אותו הצידה ולא לפנות למערך (שמתורגם לחיפוש) שוב ושוב.
שימוש במנגנון הבאפר של PHP:
פהפ משתמש בבאופר כדי לאגור את התשובות ואז לשלוח הכל בבת אחת. אם העמודים שלכם גדולים או שזמן היצירה שלהם ארוך, נראה כי התגובה בצד המשתמש גם כן ארוכה. אפשר לשחק במנגנון הבאפר של PHP, פרטים נוספים באתר של PHP. הכתבה המקורית, דרך אגב, מפנה לכאן.
המנעו מכתיבת שאילתות SQL בלולאה:
טוב, זו לא חוכמה אבל אם אתם עדיין לא יודעים, שאילתות הם דבר יקר, בכל המובנים האפשריים. גישה לPROCESS אחר, לפעמים במכונה אחרת, זכרון, דיסק, רשת.. צריך לעשות את זה כמה שפחות. ברור, אבל ברור, שלא כדאי לעשות פניות לדאטהבייס בלולאה. טריק קטן שמאפשר התיעלות במקרים מסויימים (למרות שלא יצא לי יותר מדי פעמים שזה באמת פתר לי משהו אמיתי) הוא שליחת כמה הוראות SQL בפעם אחת, ע"י שימוש ב; (נקודה פסיק) בסוף כל שאילתה, או הכנסת הרבה ערכים בשאילתה אחת לפי המתכון הבא:
$userData = [];Produces:
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $iserData);
mysql_query($query);
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
שימוש בגרש אחד עד כמה שאפשר במקום גרשיים:
רוב המפתחים מתיחסים לגרש אחד או שניים בPHP בצורה דומה, אך יש הבדל גדול. כשאתם משתמשים בגרשיים PHP מחפש משתנים בתוך המחרוזת ומחליף אותם בערכים המתאימים, ז"א שכל תו ותו במחרוזת נקראים. לפעמים זה יעיל, אבל לרוב לא. אם אין לכם משתנים זה בשבוז מוחלט, וגם פחות קריא ברוב עורכי הקוד, במיוחד הפשוטים.
נקודה נוספת למחשבה בתחום הזה: אם אתם מדפיסים מחרוזת, אפילו עם גרש אחד, עדיף לא לחבר (concatenate) את המחרוזות, המשתנים וכו – משום שמאחורי הקלעים המנוע יוצר מחרוזות זמניות, דבר שלוקח זמן וזכרון. עדיף לכתוב רשימה של ערכים מופרדת בפסיקים:
במקום:
echo 'hello, my name is '. $myName .', how are you?';
עדיף:
echo 'hello, my name is ', $myName, ', how are you?';
להשתמש בSWITCH במקום בIF.ELSE
אני אפילו לא הולך לצטט ולתרגם את החלק הזה. אין שום סימוכין ולא הסבר נורמאלי למה זה עדיף מבחינת ביצועים. מבחינת קריאות וכו' זה די ברור, אבל זה לא נושא הפוסט.