Deprecated: Creation of dynamic property CF\WordPress\DataStore::$logger is deprecated in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php on line 23

Deprecated: Creation of dynamic property CF\WordPress\Proxy::$pluginAPI is deprecated in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/Proxy.php on line 31

Deprecated: Creation of dynamic property SyntaxHighlighter::$brush_names is deprecated in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/syntaxhighlighter/syntaxhighlighter.php on line 248

Deprecated: Creation of dynamic property SyntaxHighlighter::$specialchars is deprecated in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/syntaxhighlighter/syntaxhighlighter.php on line 326
המכללה | אופטימיזציית וורדפרס - PHP ותחזוקת קוד
Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

אופטימיזציית וורדפרס – PHP ותחזוקת קוד

אחד הדברים הכי נחמדים בוורדפרס זה העושר בתוספים וערכות עיצוב. במשך ארבע וחצי השנים שאני עם וורדפרס אני לא חושב שנתקלתי במצב שבו רציתי לעשות משהו ולא היו כבר לפחות 3 תוספים שעשו משהו דומה למה שרציתי. מי שמשתתף בקבוצת הדיון של וורדפרס בעברית בוודאי שם לב שהתגובה הכמעט אינסטנקטיבית לשאלה איך עושים את זה היא – מורידים תוסף מהאתר. ואכן, השימוש בתוספים הוא פשוט ונוח אבל אחרי זמן מה של פעילות אתה מציץ בלוח התוספים בפאנל הניהול ומגלה שמותקנים 40 תוספים, מתוכם 20 פעילים, 9 זקוקים לעידכון ואין לך מושג מה עושים 50% מתוכם.

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

תוספים שאין בהם צורך

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

זללני משאבים

עד לא מזמן השתמשתי כאן בפיירסטאט של עמרי ידן – תוסף סטטיסטיקות מצויין שהתחיל כנגזרת של תוסף הסטטיסטיקות counterize. ספריית התוסף של פיירסטאט שוקלת כ 4.5 מגה ואחרי כמות נאה של חודשי שימוש נצבר במסד הנתונים מידע בנפח של 33 מגה הפרוסים על גבי 20 טבלאות. פיירסטאט הוא באמת תוסף מצויין ואהבתי את השימוש בו ואת השילוב שלו עם וורדפרס (שלא לדבר על הזמינות המעולה של עמרי) אבל זה קצת יותר מדי בשביל הצרכים שלי ויש לזה משמעות מורגשת מבחינת הביצועים בשרת.

פונקציות שעושות רעש מיותר.

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

דוגמא אחרת היא תבנית העיצוב בה אני משתמש. כפי שניתן לראות מדובר בתבנית מגזינית שמציגה את הכתבה הראשית כגדולה ועוד 5 כתבות אחרונות כקטנות. מי שכתב את התבנית הזו (מימבו) חשב על נוחיות המשתמש והכניס פה פונקציה שמחפשת עבור כל פוסט האם משוייכת לו תמונה ואם כן – מציגה את התמונה מוקטנת ליד הפוסט. כעיקרון, זה טריק מאוד שימושי ולא קשה כלל לישום אבל בכל הרצה שלו ניגשת הפונקציה למסד הנתונים, שולפת את התוכן של הפוסט הספציפי ואז עוברת על הקוד שלו כדי לחפש img src. אם היא מוצאת – מוחזרת תגית תמונה. אם בכל טעינה של הדף הראשי מוצגות 6 תמונות הרי שוורדפרס מריצה את הפונקציה הזו 6 פעמים. בעבור אתר עם 500 דפים נצפים ביום אנחנו מדברים על 3000 הרצות של הסקריפט – קצת מטופש בהתחשב בעובדה שהתמונה הזו היא תמונה קבועה.

הפיתרון המהיר ביותר היה להשתמש בשדות המותאמים אישית ולשייך עבור כל פוסט תמונה רלוונטית בעזרת התגית מטא lead-image. את התמונה מעלים כרגיל בעזרת העורך (או מעתיקים קישור של כל תמונה ברחבי האינטרנט) וורדפרס יודעת למשוך אותה בקלות כחלק מהמעבר על הלופ. (קישור למדריך: http://n2b.org/archives/551)
למעשה, בשיטה הזו החלפנו 6 קריאות למסד הנתונים וסריקות קוד מיגעות בשימוש בפונקציה מובנית של וורדפרס שנטענת כחלק מהלופ – כמות העבודה שנחסכה פה מהשרת היא משמעותית.

הזרקות קוד לערכה

מי שטרח לנסות לפתח ערכה לוורדפרס בוודאי מכיר את שתי הפונקציות wp_head ו wp_footer. שתי הפונקציות הללו הן עוגנים עבור תוספים שצריכים להכניס מידע להדר או לפוטר ולרוב משמשות כדי להכניס סקריפטים ותבניות עיצוביות נדרשות לתוספים. כך למשל תוספים של צביעת קוד טוענים קובץ CSS המכיל את הגדרות הצבעים ואילו תוסף הלייטבוקס לתמונות דוחף פנימה ג'אווה סקריפט שאחראי לטיפול בתצוגת התמונה בשכבה עילית.
אחת הבעיות העיקריות עם פיתוח תוספים לוורדרפס היא שכל מפתח משתמש במה שאהוב עליו ומכניס קריאה עבורו לקוד. לכן, אם מפתח א' יצר תוסף המבוסס על Jquery בעוד שהשני השתמש ב prototype והשלישי ב scriptaculous, תגלו שטענתם אל הערכה שלכם שלוש סביבות עבודה של JS, ומי שיציץ בקוד של האתר שלי יגלה שגם שם יש כפילויות כי מפתחים שונים עבדו עם גירסאות שונות של סביבות הפיתוח.
לצערי, עדיין לא סיימתי עם הטיפול הזה ב JS אבל הנה דברים שאפשר (וצריך) לעשות אבל באמת מומלץ שרק מי שבקי בנושא יטפל בהם.

  1. לבחור רק תוספים שמשתמשים באותה סביבת הפיתוח (רק scriptaculous או רק jquery) האמת שזה יותר קל להגיד מלעשות.
  2. לבטל את הזרקת הקוד ע"י התוספים אל תוך ההדר וקריאה אל סביבת ה JS רק פעם אחת ידנית דרך הערכה (גוגל אגב מאכסנת אצלה עותקים ממוזערים של הסביבות).
  3. את הסקריפטים הקטנים שמכילים בעצם רק את הפונצקיות הרלוונטיות לתוסף הספציפי אפשר לרכז אל תוך קובץ JS אחד ולטעון אותו בסוף הקובץ.

הסבר מצוין באנגלית ניתן למצוא כאן אם תעלה דרישה אני אתרגם.

להעביר פונקציונאליות לדפדפן המשתמש

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

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

לסיכום

  1. היפטרו מתוספים מיותרים – ורצוי על ידי מחיקה שלהם מתיקיית התוספים.
  2. הימנעו מקטעי קוד שרצים שוב ושוב בלי סיבה מיותרת.
  3. העבירו פונקציונאליות אל מחשב המשתמש.
  4. השתמשו בפונקציות מובנות של וורדפרס במקום בתוספים כשאפשר.

יש לכם תוספות? תובנות? הערות והארות יתקבלו בברכה.

לדרג את הפוסט
0

Comments

14 תגובות על “אופטימיזציית וורדפרס – PHP ותחזוקת קוד”

  1. תמונת פרופיל של יוסי לוי

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

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

    אני לא יודע אם זה המצב גם אצל בלוגרים אחרים (אשמח לשמוע מה קורה שם בחוץ).

    1. תמונת פרופיל של ~ניצן~

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

    2. תמונת פרופיל של ~ניצן~

      אגב, אם הבעיה היא שם הדף אני ממליץ להשתמש ב pmetrics יש להם גירסת חינם בסיסית או כמובן גירסאות מורכבות יותר בתשלום – אתה מוזמן לנסות.

  2. תמונת פרופיל של רויטל סלומון

    בדיוק היום ביליתי את רוב שעותיי בטיפול בוורדפרס שהשתגע לגמרי. ככל הנראה הפושע היה תוסף ה-WP-Cache אבל זה ממש לא ודאי.

    כטיפ קטן אני יכולה לציין שבדיקה ואופטימיזציה של הטבלאות בדטה בייס יכולה להועיל אף היא – אני עושה את זה דרך PHPMyAdmin.

    1. תמונת פרופיל של ~ניצן~

      אכן יש חשיבות למסד הנתונים – וזה כבר במאמר הבא.

  3. תמונת פרופיל של איתמר

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

    שאלה: התגובות המשורשרות זה משהו שבא אוטומטי בגרסא 2.8? כי אם אני זוכר נכון כשכיביתי את התוסף thread comments אז השרשור נגוז לי.

  4. תמונת פרופיל של עמרי

    העומס של פיירסטטס על שרת הוא מינימלי (בהנחה ואתה לא משתמש בשרת MYSQL היסטורי, ואז הרבה מהפונקציות המתקדמות של פיירסטטס מנוטרלות).
    יש הרבה מאוד אופטימיזציות בפיירסטטס, למשל:
    * פיירסטטס מארכב נתונים ישנים כדי להקטין את הנפח שלהם ולהאיץ את השאילתות.
    * כשמשתמש נכנס, הנתונים שלו נשמרים לטבלא במהירות ולא מעובדים. פעם בפרק זמן מסויים הנתונים שהתצטברו מעובדים במכה בצורה מאוד יעילה. פייאסטטס מסוגל לקלוט בצורה הזו אלפי כניסות בשניה.

    זו חשיבה מאוד פשטנית להניח שבגלל שפיירסטטס היא תוכנה גדולה עם 20 טבלאות היא מעיקה על השרת.
    העומס שתוכנה יוצרת על השרת לא קשורה לגודל שלה, ולא לגודל של בסיס הנתונים שלה.
    אגב, בסיס הנתונים של פיירסטטס בבלוג שלי (שמשותף לעוד כמה אתרים שאני מריץ על השרת) הוא בגודל של כ250 מגה ולא יוצר שום בעית ביצועים.

    1. תמונת פרופיל של ~ניצן~

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

      מה שכן חשבתי אולי לעשות זה להפריד את שני השרתים, כלומר שרת אחד שיריץ פיירסטאט והשני וורדפרס, אני רק לא יודע אם זה אפשרי. האם זה אפשרי?

      1. תמונת פרופיל של עמרי

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

        תראה את זה:
        http://firestats.cc/wiki/FireStats1.6_WhatsNew#JaveScripthitrecording

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

  5. תמונת פרופיל של עמרי

    אגב, לגבי גאו-קודינג:
    פיירסטטס כוללת ספרית IP2COUNTRY מאוד יעילה שכתבתי.
    http://firestats.cc/wiki/ip2c

    היא מסוגלת לטפל באלפי חיפושים בשניה על שרת ממוצע.

  6. תמונת פרופיל של עמרי

    שני דברים לגבי הבלוג:
    1. אחרי שפרסמתי תגובה אני לא רואה אותה (וגם לא רואה שהיא התקבלה וממתינה לאישור).
    2. כדאי להוסיף תוסף הרשמה לתגובות.
    את זה למשל:
    http://firefang.net/blog/subscribe-to-comments-%D7%91%D7%A2%D7%91%D7%A8%D7%99%D7%AA

    1. תמונת פרופיל של ~ניצן~

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

  7. תמונת פרופיל של שלום חברים

    שלום, אני צריכה עזרה.. בעבודה עם וורדפרס..
    אז ככה.. אני בונה אתר לעמותת חיות ששמה "גלבוע אוהבת חיות" ואני צריכה שמישהו יאיר את עיניי לגבי כמה דברים:
    1. אם אני צריכה להוסיף דף שבו המנהל יכול להוסיף חיות ולעדכן את הפרטים שלהם, איך אני עושה זאת?
    2. לטבלה הזו של הפרטים אני צריכה להוסיף גם אפשרות להעלאת תמונות, איך זה קורה? הבנתי שעדיף שלא לשמור אותם בדטהבייס אז איך נמותנים לו את האפשרות להעלות תמונה ושמאחורה היא תישמר באיזשהיא תיקייה או משהו כזה?
    3. יש למישהו תוסף מומלץ להצגת מצגות?
    4. איך אני מריצה PHP בוורדפרס? האם הדרך היחידה היא ע"י התקנת תוסף phpexe או משהו בסגנון?
    5.אני גם צריכה להוסיף אפשרות של הרשמה לאתר.. וראיתי כאן שיש את ה-Login וההרשמה, אשפר לשאול איך קוראים לתוסף?

    6. אמממ זה מה שיכולתי לחשוב עליו כרגע,

    מודה לכל מי שיעזור..

    רויטל

  8. תמונת פרופיל של זיו לפיד

    תודה על המידע החשוב

כתיבת תגובה

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


Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/DataStore.php:23) in /home/nitzan_n2b/n2b.org/wordpress/wp-content/plugins/cloudflare/src/WordPress/HTTP2ServerPush.php on line 79