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 מהנה ומועיל.

6 תגובות בנושא “PHP – על Opcode Caching ו- APC”

  1. תוכל להרחיב קצת יותר על apc.stat?
    אם אני זוכר נכון הבדיקת עדכניות שהוא מבצע מבזבזת זמן חשוב שאפשר להימנע ממנו..

    1. הבדיקה באמת צורכת משאבים וזמן ריצה נוסף, אך עד כמה זה "חשוב" זה משהו יחסי.

      ניתן לבטל את הבדיקה אם תגדיר את apc.stat כ- "0". אבל אז מה שאתה עושה זה בעצם – לבטל את הבדיקה.
      ברגע שהקובץ יכנס למטמון (בהרצה הראשונה שלו), כל עריכה נוספת שלו מאותו רגע לא תשפיע על פעילות האתר, התוכנית תמשיך למשוך את המידע "הישן" מהמטמון.
      הדרך היחידה לעדכן את המידע בצורה הזאת היא למחוק את המידע מהמטמון – אפשרי באמצעות הפונקציה "apc_clear_cache" או ע"י הרצה מחדש של שרת ה- http (וכך למעשה ליצור תהליך חדש עם זכרון נקי).

      מתי זה טוב?
      כשאתה מעדכן את הקבצים בצורה מבוקרת (git לדוג') ויכול להגדיר קובץ שירוץ וינקה את המטמון לאחר כל עדכון,
      כשאתה מעדכן את הקבצים לעיתים רחוקות ולוקח על עצמך את האחריות לניקוי המטמון בהתאם לצורך.

  2. היי אדיר,
    אחלה כתבה, נהנתי לקרוא!

    אבל יש לי תהייה.. מה הבדל בין הcache באמצעות flile cache & output buffering לבין השיטה של ה APC?

    1. היי אלכס,
      אני שמח לשמוע שנהנית לקרוא.

      בנוגע לתהייה שלך –
      מדובר בפעולות המתבצעות בשלבים שונים ולמטרות שונות.
      הפתרון המוצג בפוסט מדבר על קאשינג לקוד התוכנית – במקום שהמפרש יצטרך לבצע את אותה הפעולה בדיוק שוב ושוב – הוא מבצע אותה פעם אחת בלבד וממשיך להשתמש בה כל עוד היא רלוונטית.
      הפתרונות שאתה מציין (output buffering ו- file caching) מתבצעים בשלב מאוחר יותר של התהליך ומיועדים לפתור בעיות אחרות.

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

      אדיר.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *