PHP – על Opcode Caching ו- APC

אני מאמין שכל מפתח PHP תהה פעם איך הוא יכול לשפר את ביצועי המערכת שלו, אני מעריך גם שמצאתם מידע אין-סופי בנושא, לפעמים הבנתם אותו יותר ולפעמים פחות.
היום אני מתכוון לסקור את הנושא של Opcode Caching ומימוש שלו באמצעות APC.

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

מה זה Opcode Caching?

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

מה זה APC?

APC (ר"ת של Alternative PHP Cache) הוא אחד התוספים הנפוצים והמומלצים לביצוע Opcode Caching, ב- PHP 6 הוא גם יהיה מובנה בשפה עצמה ולא יהיה צורך להתקין אותו בנפרד.
APC משתמש ב- shared memory ו- mapping table לאחסון המידע.
חשוב לציין ש- APC יעבוד רק כאשר ה- PHP רץ כ- apache module (אמרנו כבר shared memory), אין אפשרות להשתמש ב- APC כאשר אנחנו עובדים בתצורת CGI.

איך מתקינים APC?

את APC ניתן להתקין בקלות באמצעות PECL, לצורך המאמר אסביר איך להתקין אותו במערכות מבוססות Unix.
יש להריץ את הפקודה הבאה כ- root (או באמצעות sudo):

pecl install apc

לאחר מכן יש להוסיף ל- php.ini (קובץ הקונפיגורציה של ה- PHP) את השורה הבאה:

extension=apc.so

כעת יש לבצע הפעלה מחדש לשרת ה- http וזה הכל!
על מנת לבדוק אם התוסף הותקן כמו שצריך, צרו קובץ חדש עם התוכן:

<?php
phpinfo();
?>

הריצו אותו וחפשו אחר "apc", מצאתם? מצויין.

הגדרות חשובות

ישנן מס' הגדרות חשובות שרצוי להכיר, אסקור עבורכם כמה מהן:

  • apc.enabled – האם התוסף יפעל או לא.
    כברירת מחדל מוגדר כ- "1" (פעיל), הגדרה כ- "0" תבטל את התוסף.
  • apc.shm_segments – כמות יחידות ה- shared memory שיוקצו עבור התוסף.
    כברירת מחדל מוגדר כ- "1".
  • apc.shm_size – נפח הזכרון (ב- mb) שיוקצה עבור כל יחידת shared memory.
    כברירת מחדל מוגדר כ- "32".
  • apc.num_files_hint – הכמות המירבית של הקבצים שישמרו במטמון.
    כברירת מחדל מוגדר כ- "1000".
  • apc.ttl – זמן התפוגה (בשניות) של המידע השמור.
    כברירת מחדל מוגדר כ- "0" (לא פג לעולם).
  • apc.cache_by_default – האם לבצע opcode caching אוטומטית.
    כברירת מחדל מוגדר כ- "1" (כן), הגדרה כ- "0" תבטל את זה.
  • apc.max_file_size – גודל הקובץ המירבי (ב- mb) שניתן לשמור.
    כברירת מחדל מוגדר כ- "1".
  • apc.stat – בודק בכל בקשה האם המידע השמור במטמון עדכני.
    כברירת מחדל מוגדר כ- "1" (כן), הגדרה כ- "0" תבטל את זה (להשתמש בזהירות).

מידע אודות הגדרות נוספות ניתן למצוא בעמוד APC Configuration.

שיהיה לכם Opcode Caching מהנה ומועיל.

מה חדש ב- PHP 5.4

מי שהספיק להתעדכן ומי שלא – כשמונה חודשים לאחר ששוחררה גרסת האלפא הראשונה,
אתמול (01/03/12) שוחררה הגרסה הרשמית והמלאה של PHP 5.4.0.
בפוסט זה אספק סקירה קצרה של השינויים, החידושים, מה כבר לא קיים, ממה יש להיזהר ולמה לשים לב במיוחד בגרסה החדשה. הפוסט מיועד בעיקר למפתחי PHP ולבעלי שרתים שמריצים PHP.

מה חדש?

  • traits – עבור מי מכם שמממש OOP, בוודאי תשמחו לדעת שכעת גם PHP תומכת ב- traits.
    מי שלא בטוח מה זה בדיוק המאכל הזה שרשמתי מקודם, זה די דומה להורשה, מושג שעשוי להיות קצת יותר מוכר לכם.
  • קידוד – קידוד ברירת המחדל השתנה מ- "ISO-8859-1" ל- "UTF-8". בנוסף לכך התווספה תמיכה כברירת מחדל ב- Multibyte.
  • הגדרת מערכים – זוכרים את המילה Array שרשמתם לפני כל הגדרה של מערך? לא עוד.
    מהיום תוכלו להגדיר מערכים בדרך קצרה יותר.

    $a = [1, 2, 3, 4];
    $a = ['one' =&gt; 1, 'two' =&gt; 2, 'three' =&gt; 3, 'four' =&gt; 4];

    אהבתם? גם אני.

  • פונקציות אנונימיות – אולי אתם מכירים את זה כ- Closures, בכל אופן עכשיו ניתן להשתמש ב- this$ גם בהן, אם במקרה זה היה חסר לכם.
  • short_open_tag – זוכרים את ההגדרה הזאת ב- php.ini?
    עכשיו אתם יכולים להשתמש בתגי פתיחה וסגירה מקוצרים גם בלעדיה, זה יפעל תמיד.
  • מד התקדמות – כעת גם אתם יכולים ליצור מד התקדמות במערכת העלאת הקבצים שלכם בלי להסתבך יותר מדי. בטח תשמחו גם לשמוע שזה פעיל כברירת מחדל. מי אמר אני ולא קיבל?
  • שרת אינטרנט מובנה – זה לא חלום, אפילו אחזור על זה למי שפספס – שרת אינטרנט מובנה!
    לא מדובר פה על משהו שמתיימר להחליף את Apache או Nginx בזמן הקרוב, האופציה הזאת קיימת להקלה ולנוחות בשלב הפיתוח בלבד. אבל בואו נודה באמת – בהחלט שימושי ומבורך.
  • מחלקות, פונקציות ושאר ירקות – יש גם לא מעט קבועים חדשים, מחלקות חדשות, שיטות חדשות ופונקציות חדשות, במקום לסקור את הכל פשוט אקשר אתכם לרשימות המלאות.
    קבועים חדשיםמחלקות חדשותפונקציות חדשותשיטות חדשות

מה ירד?

  • register_globals – הגדרה שנוייה במחלוקת שעלולה הייתה ליצור בעיות אבטחה רבות. כבר בעבר היא כובתה כברירת מחדל, כעת היא הוסרה לחלוטין.
  • magic_quotes – הגדרה נוספת שלא הייתה אהודה כל כך בקרב המפתחים, מטרתה הייתה לבצע הברחה אוטומטית (באמצעות התו "") על כל קלט שהתקבל. פעולה זו יצרה בעיות רבות שהעיקרית שבהן הייתה הברחה כפולה. בגרסה החדשה ההגדרה הזאת לא קיימת יותר.
  • safe_mode – הגדרה נוספת שאינה קיימת יותר, החברים ב- PHP החליטו שזה לא מתפקידה של השפה לפתור את בעיות האבטחה הללו. אתייחס לזה שוב בהמשך.
  • מצביעים – עד עכשיו ניתן היה להעביר לפונקציה "התייחסות" (מצביע) למשתנה כלשהו הן בעת הגדרתה והן בזמן הקריאה, כעת ניתן להגדיר פרמטר כמצביע אך ורק בעת הגדרת הפונקציה.
  • סיישנים – הפונקציות session_register, session_unregister ו- session_is_registered אינן קיימות יותר. ניתן להשתמש בהצבה באמצעות האופטור "=" ובפונקציות unset ו- isset למטרה זו.
  • mysqli – מגוון שמות נוספים (Alias) ששימשו לקיצור השמות הארוכים של חלק מהפונקציות במחלקה הזו הוסרו, להלן הרשימה המלאה לנוחיותכם (חלקן עדיין קיימות).

מה נשתנה הלילה הזה?

לאחר שסקרנו את השינויים היותר מהותיים לדעתי, בואו נראה מה בעצם קורה עכשיו.
אין ספק שתמיכה ב- traits הינה מבורכת ומעלה בשלב נוסף את התמיכה בתכנות מונחה עצמים של השפה, כל הכבוד לחבר'ה על המאמץ והפיתוח.

תמיכה ב- multibyte כסטנדרט, הגדרת מערכים בקלות, מד התקדמות מובנה ותגי פתיחה וסגירה מקוצרים – תוספות מצויינות שתורמות לשפה ללא ספק. אבל, אני חושב שהכתר מגיע דווקא לשרת האינטרנט המובנה. למרות שאת הביטוי "LAMP" אני בטוח שיכירו גם מחר, לדעתי זאת אופציה מצוינת.

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

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