בעיה מוזרה של פונקצית ob_start של PHP

משום מה בשבוע האחרון האוגדן התחיל לסבול מכל מיני שיהוקים מבלי שנגעתי לו בקוד, ומאחר שלא היה לי את מי להאשים גייסתי את כל הכוחות הנפשיים והתחלתי לדבג. הבעיה הראשונית היתה שכלל לא היה פלט ובמסגרת שיטת ה"גשש ונחש*" שפותחה במשך מאות שנים על ידי מתכנתים עלומי שם הפנתי את האצבע המאשימה כלפי כלפי הקריאה ob_start('ob_gzhandler') לקימפרוס הפלט והעפתי אותה מהקוד.הפלה ופלה נראה שהכל הסתדר (ויותר מזה כי לאחר מכן האפאצ' הפסיק להתקע, דבר שהוא היה עושה פעם בשבוע).

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

מסקנות:

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

כלומר, הצורה הנכונה להשתמש בob_start היא רק על פלטים קטנים ככל האפשר, או במילים אחרות לקרוא לob_flush() בהקדם האפשרי.

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

*במקומות מסוימים בעולם ידועה כשיטת רופא האליל

תגובה אחת “בעיה מוזרה של פונקצית ob_start של PHP”

להגיב על כרמית לבטל

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