הדף הזה הוא רפרנס לכל המתודות הציבוריות של cache_engine (api/core/collections/cache_engine.php). הוא עונה על "מה בדיוק מקבלת ומחזירה המתודה הזו". להסבר מושגי ראו סקירת המטמון, מטמון עמוד שלם ו-ניהול המטמון בפאנל; דוגמאות שימוש נוספות ב-cache-api.
המנוע מבוסס קבצים בלבד: אין Redis או Memcached. כל ערך הוא קובץ תחת CONFIG::$cache_folder, והפרטים החשובים:
- תוקף הערך הוא ה-mtime של הקובץ. בעת כתיבה הקובץ מקבל
touchלזמן שבו הוא אמור לפוג (עכשיו + מספר השעות). קובץ הוא "טרי" כל עודfilemtime($file) > time(). - שני תחומים: תיקיית פלטפורמה
CONFIG::$cache_folder/<SERVER_NAME>(נפרדת לכל דומיין) ותיקיית שורשCONFIG::$cache_folder(משותפת לכל הדומיינים בשרת). - כתיבה אטומית: כל כתיבה היא קובץ זמני ואז
rename, כך שקורא לא רואה קובץ חצי-כתוב. - דחיסה: נתונים נשמרים כ-
.chc.gzועמודים כ-.html.gzכברירת מחדל. קריאה מכבדת גם קבצים לא דחוסים ישנים.
CONFIG::$allow_cache
מטמון העמוד השלם (cache_php_check, ושמירה ב-core.php) פועל רק כש-CONFIG::$allow_cache == true ובשמירה גם CONFIG::$system_type == "client". מטמון הנתונים (get, get_html, get_item) אינו תלוי בדגל הזה ופועל תמיד.מאפיינים סטטיים#
| מאפיין | ברירת מחדל | משמעות |
|---|---|---|
$cache_folder | false | לא בשימוש בפועל. התיקייה האמיתית היא CONFIG::$cache_folder |
$platform_cache_folder | false | זיכרון של get_platform_cache_folder() בתוך הבקשה |
$compress_pages | true | עמודים נשמרים כ-.html.gz |
$compress_data | true | נתונים נשמרים כ-.chc.gz |
$override_page_url | false | כתובת עמוד שנקבעה ב-set_page_url() |
$cache_functions | [] | רישום ה-items (set_item) |
$tracking_params | רשימת פרמטרי מעקב | utm_*, fbclid, gclid, msclkid, _ga ועוד. ראו strip_tracking_params() |
$use_build_lock | true | false מכבה את נעילת הבנייה |
$build_lock_wait_ms | 750 | כמה זמן בקשה שהפסידה במירוץ הבנייה ממתינה |
$build_lock_handle | false | ה-handle של הנעילה שבידי הבקשה הזו |
$build_lock_loser | false | הבקשה הפסידה, חיכתה ופג זמנה: תרנדר אבל לא תכתוב |
$serve_stale_while_building | true | הגשת עמוד שפג תוקפו בזמן שבקשה אחרת בונה אותו מחדש |
$gc_grace_hours | 48 | קובץ שפג נמחק פיזית רק אחרי כמה שעות |
$serve_gz_direct | true | הגשת בייטים דחוסים ישירות, בלי פענוח ודחיסה מחדש |
$native_find | null | תוצאת הבדיקה של GNU find ב-cleanup_expired |
תיקיות ונתיבים#
cache_engine::get_platform_cache_folder()#
static function get_platform_cache_folder()
מחזירה: string, CONFIG::$cache_folder . '/' . $_SERVER["SERVER_NAME"], ונזכרת למשך הבקשה. אם SERVER_NAME ריק או מכיל /, \, .. או NUL, השם מוחלף ב-_invalid_host_<12 תווי hash> כדי שלא ייצא מתיקיית המטמון או יתמזג עם השורש.
cache_engine::check_server_name()#
static function check_server_name()
מחזירה: תמיד true. רשימת הדומיינים המותרים הושבתה בכוונה (הבידוד נעשה לפי תיקיית הדומיין). נשארה כדי שקוד קיים שקורא לה ימשיך לעבוד.
מטמון נתונים (.chc)#
מאחסן כל ערך PHP שאפשר לעשות לו serialize: מערכים, אובייקטים, מחרוזות, מספרים.
cache_engine::get()#
static function get($key, $func = false, $hours = 24, $in_platform = true)
| פרמטר | משמעות |
|---|---|
$key | שם הקובץ, יחסית לתיקיית הפלטפורמה (או לשורש). יכול לכלול / לתתי-תיקיות |
$func | callable שמחשב את הערך כשאין cache. false: רק קריאה. מערך נשמר כערך עצמו ולא מופעל (גם כשהוא callable, כמו [$obj, "method"]) |
$hours | תוקף בשעות (ברירת מחדל 24). מספר עשרוני מותר, למשל 2/60 לשתי דקות |
$in_platform | true: תיקיית הדומיין. false: השורש המשותף |
מחזירה: את הערך מה-cache; אם אין cache, את תוצאת $func (אחרי שנשמרה); false כשאין cache ואין $func. אם DB::$error_count עלה בזמן ש-$func רץ, התוצאה מוחזרת אבל לא נשמרת.
$modules = cache_engine::get("modules_tbl", function () {
return DB::get_all("SELECT * FROM " . CONFIG::$db_fullprefix . "modules", "id");
}, 24 * 7);
false הוא "אין cache"
ערך שנשמר ככה והוא false אינו ניתן להבחנה מהיעדר ערך, והפונקציה תחשב אותו מחדש בכל קריאה. אחסנו 0, "" או מערך ריק, לא false.$key מודבק לנתיב קובץ בלי ולידציה. אל תבנו אותו מקלט משתמש, גם לא חלקית. מפתח עם .. יכול לצאת מתיקיית המטמון.cache_engine::save_cache_file()#
static function save_cache_file($key, $data, $hours = 24*7, $in_platform = true)
כותבת ערך ל-cache בלי לחשב אותו. $hours ברירת המחדל כאן היא 7 ימים (לעומת 24 שעות ב-get). שומרת serialize($data) (דחוס gzip רמה 6 כש-$compress_data), ומוחקת את הגרסה בפורמט ההפוך כדי שלא תישאר גרסה ישנה. מחזירה: false רק אם $in_platform ו-check_server_name() נכשלה (לא קורה בפועל), אחרת כלום (null), גם כשהכתיבה עצמה נכשלה.
כל הפרמטרים $hours במחלקה הם שעות, לא שניות ולא ימים.
cache_engine::get_cache_file()#
static function get_cache_file($key, $in_platform = true)
מחזירה: את הערך שנשמר (אחרי unserialize) אם קיים קובץ טרי, אחרת false. קובץ .gz פגום נמחק והפונקציה מחזירה false. זו הליבה של get(), ושימושית כשרוצים לבדוק קיום בלי לבנות.
unserialize בלי allowed_classes
תוכן הקובץ עובר unserialize כמות שהוא. מי שיכול לכתוב לתיקיית ה-cache יכול להריץ קוד דרך אובייקט PHP זדוני. הרשאות הכתיבה לתיקייה הן חלק מגבול האבטחה: ראו הקשחה.cache_engine::remove()#
static function remove($key)
מוחקת קבצי .chc ו-.chc.gz שמתחילים ב-$key (glob($key . "*")), בכל תיקיות המשנה הישירות של CONFIG::$cache_folder (כלומר כל הדומיינים, ותיקיית items), ובשורש עצמו. מחזירה: כלום.
cache_engine::remove("modules_tbl"); // גם modules_tbl_extra אם קיים
המחיקה היא לפי prefix וחוצת דומיינים: ב-hosting משותף, remove("settings") מוחקת גם settings_extra, וגם את settings של כל שאר האתרים בשרת. בחרו מפתחות עם prefix ייחודי, ואל תקראו לה בלולאה על קלט.
קטעי HTML (.html)#
cache_engine::get_html()#
static function get_html($key, $func = false, $hours = 24)
| פרמטר | משמעות |
|---|---|
$key | שם הקובץ בתיקיית הפלטפורמה (נשמר כ-<key>.html) |
$func | callable שמחזיר מחרוזת HTML. false: רק קריאה |
$hours | תוקף בשעות |
מחזירה: מחרוזת ה-HTML מה-cache, או התוצאה של $func (אחרי שנכתבה, ללא דחיסה), או false.
echo cache_engine::get_html("footer_" . (int)CONFIG::$lang, function () {
return render_footer(); // הפונקציה שלכם
}, 6);
cache_engine::remove_html()#
static function remove_html($key)
מוחקת כל <key>*.html בתיקיית הפלטפורמה של הדומיין הנוכחי (prefix, כמו remove, אבל לדומיין הזה בלבד). מחזירה: כלום.
Items: אובייקט מטמון לפי סוג ומזהה#
Item הוא ערך שנבנה מרשומה אחת ומתרענן בנפרד. הסוג נרשם פעם אחת עם set_item(), ואז get_item() מחזיר את הערך מה-cache או בונה אותו. הקבצים נשמרים תחת items/<type>/<ה-id מפוצל לזוגות ספרות>/<id>, למשל id 12345 הופך ל-items/news/12/34/5/12345. ברירת המחדל היא השורש המשותף ($in_platform = false) ותוקף 30 יום.
cache_engine::set_item()#
static function set_item($type, $m_params)
מפתח ב-$m_params | ברירת מחדל | משמעות |
|---|---|---|
parse | false | function ($item_row, $item_id): בונה את הערך לשמירה. חובה |
query | false | function () שמחזירה DB_QUERY_OBJECT. הקוד מוסיף לו whereCond[queryKey] = $item_id ו-limit = "0,1" ושולף שורה. בלי query, parse מקבל false כשורה |
queryKey | "id" | העמודה שמסוננת לפי ה-id |
parse_after | function ($data): מופעל על הערך בכל החזרה (גם מה-cache). לשינויים שאסור לשמור (למשל הזרקת נתוני בקשה) | |
on_refresh | function ($item_id): מופעל אחרי בנייה חדשה ואחרי remove_item() |
מחזירה: כלום. הרישום נשמר ב-cache_engine::$cache_functions בלבד, לבקשה הנוכחית, ולכן חייבים להריץ אותו בכל בקשה לפני get_item (בליבה: בקובץ הקונטרולר או הספרייה שמשתמשים בו).
cache_engine::get_item()#
static function get_item($item_type, $item_id, $in_platform = false, $refresh = false, $create = true)
| פרמטר | משמעות |
|---|---|
$item_type | הסוג שנרשם ב-set_item |
$item_id | מזהה הרשומה |
$in_platform | false (ברירת מחדל): שורש משותף. true: תיקיית הדומיין |
$refresh | true: מתעלם מה-cache ובונה מחדש |
$create | false: קריאה בלבד, מחזיר false אם אין cache |
מחזירה: הערך (אחרי parse_after), או false כש-$create שקר ואין cache, או כש-query לא מצא רשומה (ואז, אם $refresh === true, גם נמחק ה-cache של ה-item).
cache_engine::set_item("news_card", [
"query" => function () { return DB::query("news", ["is_active" => 1]); },
"parse" => function ($row, $id) { return ["title" => $row["title"], "url" => "/news/" . (int)$id]; },
]);
$card = cache_engine::get_item("news_card", 15);
קריאה ל-get_item על סוג שלא נרשם (או שה-parse שלו לא callable) מפעילה trigger_error(..., E_USER_ERROR) שעוצר את הבקשה. ודאו ש-set_item רץ לפני כל קריאה, גם בנתיבי AJAX וב-cron.
cache_engine::remove_item()#
static function remove_item($item_type, $item_id)
מוחקת את קבצי ה-item (בעזרת remove(), ולכן בכל הדומיינים ולפי prefix) ומפעילה את on_refresh אם רשום. מחזירה: כלום. קוראים לה בכל מקום שבו הרשומה משתנה או נמחקת (כך עושה admin/tag_manager.php).
cache_engine::refresh_item()#
static function refresh_item($item_type, $item_id, $in_platform = false)
קיצור ל-get_item($type, $id, $in_platform, true): בונה מחדש ושומר. מחזירה: כלום (הערך אינו מוחזר; קראו ל-get_item אם צריך אותו).
מטמון עמוד שלם#
העמוד המוכן נשמר ב-<platform>/pages/<url>.html.gz (למובייל pages_mobile, לפי PAGE::is_mobile()), ו-cache_php_check() מגיש אותו בתחילת הבקשה, לפני טעינת הקונטרולרים. זרימה: core.php קורא ל-cache_php_check() בשורה 17; קונטרולר שרוצה cache קורא ל-cache_all_page(); בסוף הבקשה core.php קורא ל-cache_all_page_save() כש-PAGE::$cache_this_page === true.
cache_engine::cache_php_check()#
static function cache_php_check($url = false)
| פרמטר | משמעות |
|---|---|
$url | כתובת לבדיקה. false: $_SERVER['REQUEST_URI'] (אחרי הסרת פרמטרי מעקב) |
מחזירה: כלום. אם יש עמוד טרי, שולחת את ה-Content-Type המתאים (HTML, JSON, RSS או XML לפי התוכן והכתובת), מדפיסה אותו ו-exit. אם $_POST["reload_cache"] קיים, מבטלת את מגבלת הזמן ויוצאת בלי להגיש (בקשה כזו בונה מחדש). אם אין עמוד טרי אבל יש עמוד שפג ובקשה אחרת בונה אותו כרגע, מגישה את הישן (stale). לבסוף בודקת גם קובץ CSS ב-scss/<url>.css.
reload_cache פתוח לכולם
הקוד לא בודק הרשאה: כל בקשת POST עם reload_cache מדלגת על ה-cache וגורמת לבנייה מחדש. זה הכלי שמשמש את ping_cache, אבל גם מי שמכיר את השם יכול להשתמש בו כדי לעקוף את ה-cache ולהעמיס. הגנה בשכבת השרת (למשל חסימת POST לדפי תוכן) היא באחריות ההקשחה.cache_engine::cache_all_page()#
static function cache_all_page($hours = 24, $set_page = false)
| פרמטר | משמעות |
|---|---|
$hours | תוקף העמוד בשעות. נשמר ב-PAGE::$cache_this_page_hours |
$set_page | כתובת (מחרוזת) לשימוש כמפתח במקום ה-URI. מועברת ל-set_page_url() |
מחזירה: כלום. מסמנת PAGE::$cache_this_page = true, ואם בקשה אחרת כבר בונה את אותו עמוד, ממתינה עד $build_lock_wait_ms (750ms) ומגישה את העמוד שלה ברגע שיופיע (בהצלחה: exit).
// בתוך קונטרולר של עמוד ציבורי
cache_engine::cache_all_page(6); // העמוד יישמר ל-6 שעות
עמוד שתלוי במשתמש מחובר, בסל קניות או בתוכן מותאם אישית אסור שיישמר: כל מבקר יקבל את העמוד שנבנה עבור הראשון. קראו לה רק בעמודים זהים לכולם.
cache_engine::cache_all_page_save()#
static function cache_all_page_save($data, $url)
מחזירה: false כשהבקשה "הפסידה" במירוץ הבנייה ופג זמנה ($build_lock_loser); אחרת כלום. כותבת את $data (דחוס gzip רמה 6 כש-$compress_pages) ל-<platform>/pages[_mobile]/<encode_url($url)>.html.gz, עם תוקף PAGE::$cache_this_page_hours. נקראת מ-core.php; לא קוראים לה ידנית.
cache_engine::cache_all_page_update()#
static function cache_all_page_update($url)
מחזירה: תמיד true. מפעילה ping_cache($url) שגורם לבנייה מחדש של העמוד (דסקטופ ומובייל).
cache_engine::cache_all_page_remove()#
static function cache_all_page_remove($url, $hard_delete = false)
| פרמטר | משמעות |
|---|---|
$url | נתיב העמוד (ללא דומיין) |
$hard_delete | true: מחיקה פיזית מיידית. false: סימון כפג תוקף (ראו drop_page_file) |
מחזירה: כלום. מבטלת את העמוד ב-pages וב-pages_mobile (כולל הווריאנטים + ו-bgl_url_encode) ואז כל קובץ שהכתובת שלו מתחילה באותו נתיב (תתי-עמודים וגרסאות עם פרמטרים). לדף הבית ($url ריק) מבטלת רק אותו.
cache_engine::cache_all_page_remove("/news/my-article"); // התוצאה נבנית מחדש בביקור הבא
cache_engine::cache_all_page_remove("/legal/page", true); // תוכן שחייב להפסיק להיות מוגש מיד
עם $hard_delete = false (ובעוד $serve_stale_while_building דלוק) הקובץ נשאר בדיסק עם תוקף שפג, ובזמן הבנייה מחדש מבקרים מקבלים את העמוד הישן. לתוכן שחייב להיעלם מיד (הסרה משפטית, זכויות יוצרים) העבירו true. הקבצים שפגו נמחקים בפועל רק ב-cleanup_expired(), אחרי תקופת החסד.
/news מבטלת גם /news-archive ו-/newsletter, כי הכתובות מתחילות באותה מחרוזת. זה מכוון (כדי לתפוס תתי-עמודים), אבל מעיף יותר מהצפוי.cache_engine::drop_page_file()#
static function drop_page_file($file, $hard_delete = false)
מבטלת קובץ עמוד בודד: אם לא $hard_delete ו-stale מופעל, מקדימה את ה-mtime ב-60 שניות אחורה (פג, אבל קיים); אם ה-touch נכשל (למשל קובץ של משתמש אחר), או ב-$hard_delete, מוחקת. מחזירה: כלום.
cache_engine::set_page_url() ו-get_page_url()#
static function set_page_url($url)
static function get_page_url()
set_page_url($url) קובעת כתובת חלופית לשמירה ולנעילה ("/" . rtrim($url, "/")) וקוראת מיד ל-cache_php_check($url). get_page_url() מחזירה את הכתובת שנקבעה, או $_SERVER['REQUEST_URI']. שימושי כשהעמוד מוגש תחת כתובת שאינה ה-URI בפועל.
cache_engine::encode_url()#
static function encode_url($url)
הופכת כתובת למפתח קובץ בטוח. מחזירה: string: בלי / בקצוות, בלי ? (הוא נמחק, לא מוחלף, כך ש-/page?a=1 הופך ל-pagea=1), עם urldecode אם יש %, וכשהסגמנט האחרון ארוך מ-50 תווים הוא מוחלף ב-sha256 שלו. כתובת עם .. (גם אחרי פענוח, למשל %2e%2e) או NUL: die("Invalid URL").
כל צירוף פרמטרים יוצר קובץ cache משלו, ואין תקרה. סורק שמוסיף ?x=1, ?x=2... ימלא את הדיסק. פרמטרי מעקב מוסרים לפני כן (ראו strip_tracking_params), אבל כל פרמטר אחר לא.
cache_engine::strip_tracking_params()#
static function strip_tracking_params($url)
מסירה מה-query פרמטרים שמזהים מקור תנועה בלבד (הרשימה ב-$tracking_params, השוואה לא תלוית רישיות ואחרי urldecode) ושומרת את שאר הפרמטרים בסדרם. מחזירה: את הכתובת, או הנתיב בלבד אם לא נשאר דבר. cache_php_check משנה בעזרתה את $_SERVER['REQUEST_URI'] (לא את $_GET), כך שלחיצה עם utm_source משתמשת באותו cache כמו הכתובת הנקייה.
cache_engine::strip_tracking_params("/shop?utm_source=fb&color=red&gclid=abc"); // "/shop?color=red"
cache_engine::atomic_write()#
static function atomic_write($file, $content, $expire_ts = false)
כותבת לקובץ זמני באותה תיקייה, מגדירה לו touch($expire_ts) אם הועבר, ואז rename לשם הסופי. יוצרת את התיקייה אם חסרה. מחזירה: true בהצלחה, false בכשל. זו הדרך הנכונה לכתוב קובץ cache מותאם אישית.
cache_engine::ping_cache()#
static function ping_cache($url, $timeout = 1)
| פרמטר | משמעות |
|---|---|
$url | נתיב יחסי (מתחבר ל-CONFIG::$env_url) |
$timeout | שניות. משפיע רק במסלול ה-curl (כשאין exec) |
מחזירה: כלום. שולחת POST עם reload_cache=true פעמיים: כדסקטופ וכמובייל, ומעבירה את ה-cookies של הבקשה הנוכחית. עם exec זמין זה curl ברקע (&) שלא ממתין; אחרת curl עם timeout קצר.
ה-Cookie של הבקשה הנוכחית (כולל cookie של מנהל מחובר) נשלח ל-CONFIG::$env_url. קראו לה מזרימות ניהול בלבד, ושלחו רק כתובות שנבנו על ידיכם (הערך עובר escapeshellarg במסלול ה-exec, אבל במסלול ה-curl הוא מחובר ישירות לכתובת).
cache_engine::try_serve_gz_direct()#
static function try_serve_gz_direct($page_file, $url)
מחזירה: כלום, ו-exit בהצלחה. מגישה את בייטי ה-.gz כמו שהם (Content-Encoding: gzip, Vary, Content-Length) במקום לפענח ולדחוס מחדש בכל hit. חוזרת בשקט (והקורא עובר למסלול הפענוח) אם PAGE::$parse_page_func מוגדר, zlib.output_compression דלוק, הלקוח לא מקבל gzip, יש output buffer שאינו ob_gzhandler או הברירת מחדל, או שלא ניתן לסווג את התוכן. נקראת מ-cache_php_check.
cache_engine::sniff_content_type_gz()#
static function sniff_content_type_gz($raw, $url)
מחזירה: Content-Type (string) או false אם אי אפשר לסווג בזול. מזהה לפי סיומת/נתיב (.json, rss/feed, .xml), ואחרת מפענחת רק את ~2KB הראשונים כדי לזהות <?xml, <rss/<feed או {; ברירת מחדל text/html; charset=UTF-8.
נעילת בנייה (build lock)#
מונעת מצב שבו אלפי מבקרים בונים במקביל את אותו עמוד אחרי שה-cache פג. הנעילה היא flock על קובץ ב-<platform>/locks[_mobile]/<sha256 של הכתובת>.lock, וחיה עד סוף הבקשה (המערכת משחררת אותה גם בקריסה).
cache_engine::acquire_build_lock()#
static function acquire_build_lock()
מחזירה: true אם הבקשה רשאית לבנות (תפסה את הנעילה, או שהנעילה כבויה/לא זמינה: "נכשלים פתוח"); false אם בקשה אחרת בונה כרגע את אותו עמוד.
cache_engine::build_lock_file()#
static function build_lock_file()
מחזירה: את נתיב קובץ הנעילה של העמוד הנוכחי (לפי get_page_url() ו-PAGE::is_mobile()).
cache_engine::build_in_progress()#
static function build_in_progress()
מחזירה: true אם בקשה אחרת מחזיקה כרגע את הנעילה של העמוד הנוכחי. לא חוסמת ולא נועלת. מחזירה false אם הבקשה הנוכחית היא הבונה.
cache_engine::wait_for_build()#
static function wait_for_build()
מחזירה: כלום. בודקת כל 50ms (עד $build_lock_wait_ms) אם העמוד הופיע (ואז cache_php_check מגיש ו-exit), ואם הבונה סיים בלי עמוד, תופסת את הנעילה ובונה בעצמה. בתום ההמתנה מסמנת $build_lock_loser = true: הבקשה תרנדר לגולש שלה, אבל לא תכתוב ל-cache.
תחזוקה וסטטיסטיקה#
cache_engine::cleanup_expired()#
static function cleanup_expired($type = 'all', $dry_run = false)
| פרמטר | משמעות |
|---|---|
$type | 'all': items בשורש + כל תיקיית הדומיין (pages, pages_mobile, scss, minify, locks, .chc). 'pages': pages ו-pages_mobile של הדומיין. 'items': items בשורש |
$dry_run | true: סופרת בלי למחוק |
מחזירה: מערך deleted, freed_bytes, freed_mb, freed_gb, dry_run (ובמסלול המהיר גם 'method' => 'native'). מוחקת קבצים שתוקפם פג לפני יותר מ-$gc_grace_hours (48 שעות), ואז תיקיות ריקות. כשיש GNU find ו-exec פעיל, העבודה נעשית בפקודת find אחת (מהירה בהרבה), אחרת באיטרציה ב-PHP. שלוש הגנות: לא שורש ה-cache עצמו, לא מחוץ לשורש (בודקת realpath), ובלי תיקיית דומיין כשה-SERVER_NAME חשוד.
$preview = cache_engine::cleanup_expired('pages', true); // כמה היה נמחק
$result = cache_engine::cleanup_expired('all', false);
קבצי נתונים שנכתבו עם $in_platform = false מחוץ ל-items (ישירות בשורש המשותף) אינם בטווח אף אחד מהסוגים, ולכן אף פעם לא נמחקים אוטומטית. הניקוי רץ אוטומטית מ-cron דרך הקונטרולר cache_cleanup, ובמסך הפאנל ניהול מטמון.
cache_engine::cleanup_empty_dirs()#
static function cleanup_empty_dirs($folder)
מוחקת תיקיות ריקות ברקורסיה בתוך $folder (ואת $folder עצמה אם התרוקנה). מחזירה: כלום. נקראת מ-cleanup_expired במסלול ה-PHP; במסלול ה-GNU find הניקוי נעשה בפקודה נפרדת, וה-folder העליון אינו נמחק.
cache_engine::compress_existing_cache()#
static function compress_existing_cache($dry_run = false, $type = 'all')
כאן $dry_run ראשון ו-$type שני. compress_existing_cache('pages') מפרש את 'pages' כ-$dry_run (אמת), כלומר מריץ dry-run בלבד.
| פרמטר | משמעות |
|---|---|
$dry_run | true: מעריך חיסכון בלי לכתוב |
$type | 'all', 'pages' (קבצי .html של pages ו-pages_mobile), 'data' (קבצי .chc בתיקיית הדומיין וב-items של השורש) |
מחזירה: מערך converted, original_bytes/mb, saved_bytes/mb/gb, compression_ratio (אחוזים), dry_run, errors (רשימת הודעות). ממירה קבצים לא דחוסים ל-.gz בשמירת ה-mtime (התוקף), ומוחקת את המקור. מדלגת על קובץ שכבר יש לו .gz. ב-dry-run החיסכון הוא הערכה (יחס 0.25 ל-HTML ו-0.40 לנתונים).
cache_engine::get_stats()#
static function get_stats()
מחזירה: מערך עם המפתחות pages, pages_mobile, items, data, total. כל אחד הוא התוצאה של get_folder_stats (ל-total גם size_mb ו-size_gb). data סופר רק קבצי .chc ו-.chc.gz ישירות בתיקיית הדומיין (לא ברקורסיה); items נספר בשורש המשותף.
cache_engine::get_folder_stats()#
static function get_folder_stats($folder, $recursive = true)
מחזירה: מערך files, size_bytes, expired (קבצים ש-filemtime < time()), compressed (.gz), uncompressed, ו-size_mb (רק כשהתיקייה קיימת). תיקייה שלא קיימת מחזירה אפסים בלי size_mb. עם $recursive = false נספרים רק .chc ו-.chc.gz.
פונקציה גלובלית: cache_glob_recursive()#
function cache_glob_recursive($pattern, $flags = 0)
מחזירה: מערך נתיבים של קבצי .html ו-.html.gz שמתחילים ב-$pattern, או שנמצאים בתיקייה בשם $pattern, וברקורסיה בכל תת-תיקייה. זה מנגנון הבחירה של cache_all_page_remove ל"כל מה שמתחת לכתובת"; ה-$pattern הוא prefix ללא ולידציה, ותווי glob (*, ?) בו יתפרשו.
ראו גם#
- סקירת המטמון: איך נבנים ומתבטלים המטמונים והיחס ביניהם.
- מטמון עמוד שלם:
cache_all_page, מובייל, stale ונעילה. - cache-api: דפוסי שימוש במטמון הנתונים וב-items.
- ניהול מטמון בפאנל: ניקוי, סטטיסטיקה ודחיסה מהאדמין.
- DB:
is_table_existsו-is_column_existsשמסתמכים עלcache_engine::get. - ref-config:
CONFIG::$allow_cache,CONFIG::$cache_folder. - הקשחה: הרשאות כתיבה לתיקיית ה-cache ו-
reload_cache.