کش کردن یک تکنیک ضروری برای بهینه سازی عملکرد یک سایت وردپرسی است. شما زمان بارگذاری صفحه و سرور را به میزان قابل توجهی با ذخیره کردن محتوایی که اغلب به آنها دسترسی دارید و به جای جستجو در پایگاه داده هر بار از حافظه ارائه می شود، کاهش خواهید داد.
با این حال، کش نیز می تواند منجر به ازدحام حافظه کش شود که نتیجه معکوس دارد و سرعت سایت را کاهش می دهد و بار سرور را افزایش می دهد.
ازدحام کش چیست؟
ازدحام کش زمانی رخ میدهد که چندین فرآیند سعی میکنند محتوای ذخیرهشده یکسان را به طور همزمان بازسازی کنند.
به عنوان مثال، قطعه کد زیر سه پست اخیر را در هر صفحه از سایت شما نمایش می دهد. اگر TTL کش را روی 15 دقیقه تنظیم کنید، هر بار که حافظه نهان منقضی میشود، تمام فرآیندهایی که در حال بازسازی صفحات هستند سعی میکنند به طور همزمان همان محتوا را بازسازی کنند، که منجر به افزایش درخواستهای SQL میشود که میتواند سایت را کند کند یا حتی آن را به آن برساند. یک توقف
function my_stampeding_cache() {
$posts = wp_cache_get( 'latest_posts' );
// $posts will be false when the cache has expired
if ( false === $posts ) {
// get the latest 3 posts
// See Section 70 - Querying - for tips on a more efficient query
$args = array(
'post_type' => array( 'post' ),
'nopaging' => true,
'posts_per_page' => '3',
'no_found_rows' => true,
'ignore_sticky_posts' => true,
'order' => 'DESC',
'orderby' => 'date',
);
// The Query
$query = new WP_Query( $args );
// save the query result for exactly 15 minutes
wp_cache_set( 'latest_posts', $query->posts, 15 * MINUTES_IN_SECONDS );
}
// very simple list of post IDs
foreach ( $posts as $post ) {
echo '<li>' . intval( $post->ID ) . '</li>';
}
}
هنگامی که TTL حافظه پنهان منقضی می شود زیرا صفحات جلویی مختلف در فرآیندهای PHP که توسط یک درخواست URL آغاز شده اند بازسازی می شوند، هر یک از فرآیندها به طور مستقل حافظه پنهان را مشاهده می کنند. رفته. به این ترتیب، آنها پرس و جوهای SQL یکسان و گاهی موازی را شروع می کنند که می توانند اتلاف باشند، یا منابع را برای مدتی مسدود کنند، تا داده های اساسی را به دست آورند.
این میتواند یک سایت را در حالت چرخهای قرار دهد که در آن بهطور دورهای سرعت آن کاهش مییابد زیرا سایر جستجوها باید منتظر بمانند. همچنین ممکن است برای رسیدگی به تمام فرآیندهای ناقص PHP شروع به مقیاسبندی کند که منجر به بارگیری کند صفحه برای کاربران و ویرایشگران سایت شود.
برای جلوگیری از رکود حافظه نهان، از تکنیکهای پیشرفته ذخیرهسازی استفاده کنید که اطمینان حاصل میکند که تنها یک فرآیند در آن واحد حافظه پنهان را بازسازی میکند.
اضافه کردن جیتر به TTL
در زمینه ذخیره سازی، اصطلاح “جیت” معمولاً برای اشاره به معرفی تغییرات یا نوسانات تصادفی در یک مقدار یا پارامتر استفاده می شود.
افزودن جیتر به مقدار زمان تا زندگی (TTL) تکنیکی است که برای کاهش رکود حافظه پنهان استفاده میشود.
با معرفی جیتر به TTL، تغییرات تصادفی در زمان انقضای ورودیهای حافظه پنهان را معرفی میکنیم. به جای اینکه تمام ورودیهای حافظه نهان دقیقاً در یک زمان منقضی شوند، در زمانهای کمی متفاوت به دلیل جیتر اضافه شده منقضی میشوند. این به توزیع یکنواخت بار و کاهش احتمال رکود در حافظه پنهان کمک می کند.
مثال بدون لرزش
ورودی کش A دارای TTL 60 ثانیه است. ورودی کش B دارای TTL 60 ثانیه است.
هر دو ورودی در یک زمان ایجاد شده اند و بنابراین در یک زمان منقضی می شوند.
هنگامی که آنها منقضی می شوند، درخواست ها همه ورودی های حافظه نهان منقضی شده را به یکباره دوباره تولید می کنند، که به معنای زمان پاسخ آهسته تر و ازدحام در سرورهای کش است.
مثال با جیتر
ورودی حافظه نهان A دارای TTL 60 ثانیه با جیتر اضافه شده 10 ± ثانیه است. ورودی حافظه پنهان B دارای TTL 60 ثانیه با جیتر اضافه شده ± 10 ثانیه است.
ورودی ها در همان زمان ایجاد شده اند اما به دلیل لرزش در زمان های کمی متفاوت منقضی می شوند.
هنگامی که آنها منقضی می شوند، درخواست های بازسازی در محدوده 50 تا 70 ثانیه پخش می شوند.
با معرفی این تنوع تصادفی، درخواستها برای بازسازی حافظه پنهان در طول زمان به طور یکنواختتر توزیع میشوند و شانس تلاشهای بازسازی همزمان را کاهش میدهند و رکود حافظه پنهان را کاهش میدهند.
در اینجا یک نمونه کد برای نشان دادن این است که چگونه لرزش در TTL به جلوگیری از رکود حافظه پنهان کمک می کند:
function get_some_cached_data() {
$key = 'cache_key';
// Check if the transient cache entry exists
$value = wp_cache_get( $key );
if ( false !== $value ) {
return $value;
}
// If the cache entry doesn't exist, generate a new value
$value = generate_value();
// Set the transient cache entry with the generated value and TTL
$ttl = get_cache_ttl( 60 ); // TTL in seconds, with a jitter
wp_cache_set( $key, $value, null, $ttl );
return $value;
}
function get_cache_ttl( $ttl ) {
// Add a jitter to the TTL
$jitter = 0.1; // 10% jitter
$jittered_ttl = $ttl + ( $ttl * $jitter * ( rand( 0, 1 ) ? 1 : -1 ) );
return $jittered_ttl;
}
function generate_value() {
// Simulate generating a new value
sleep( 1 ); // Simulated delay in generating the value
return 'Generated value';
}
// Example usage
$value = get_some_cached_data( $key );
به طور کلی، افزودن جیتر به TTL به هموارسازی الگوهای ترافیک و کاهش مشکلات عملکرد بالقوه ناشی از ازدحام حافظه پنهان کمک میکند.
ذخیره از طریق wp-cron
یکی از موثرترین راهها برای جلوگیری از رکود حافظه پنهان استفاده از آن است wp-cron
برای بازسازی حافظه پنهان در فواصل از پیش تعیین شده یا در پاسخ به رویدادهای خاص. در اینجا، تنها یک فرآیند مسئول بازسازی محتوا است و اطمینان حاصل می کند که هیچ تلاش تکراری یا مناقشه ای برای منابع وجود ندارد.
چندین استراتژی برای بازسازی کش وجود دارد wp-cron
بسته به ماهیت و فراوانی بهروزرسانیها.
1. بازسازی برنامه ریزی شده
یک برنامه منظم برای بازسازی حافظه پنهان (ساعتی، روزانه یا هفتگی) تنظیم کنید. این رویکرد حالت TTL ذخیره سازی را تقلید می کند، اما به جای اینکه حافظه پنهان بلافاصله پس از انقضا آن دوباره تولید شود، آن را در فواصل از پیش تعیین شده بازسازی می کنید.
2. بازسازی مبتنی بر رویداد
حافظه پنهان را در پاسخ به رویدادهای خاص، مانند زمانی که یک پست وضعیت را از منتشر شده به منتشر نشده تغییر می دهد، یا زمانی که یک نظر جدید به یک پست اضافه می شود، دوباره ایجاد کنید. این رویکرد تضمین می کند که کش همیشه به روز است و از نیاز به بازسازی دوره ای جلوگیری می کند.
3. بازسازی بر اساس تقاضا
هنگامی که یک پست بهروزرسانی میشود، حافظه پنهان را در صورت تقاضا بازسازی کنید. این برای سایتهایی که بهروزرسانیهای مکرر دارند مفید است، اما میتواند روند ویرایش را کند کند، بنابراین با احتیاط از آن استفاده کنید.
افزایش عملکرد سایت Front End در وردپرس
بیاموزید که چگونه تصاویر، فونت ها و CDN ها به سرعت و ثبات سایت کمک می کنند.
استراتژی بازسازی شما به نیازهای خاص سایت شما و الگوهای استفاده بستگی دارد. به عنوان مثال، اگر سایت شما محتوای تولید شده توسط کاربر زیادی دارد، از بازسازی مبتنی بر رویداد استفاده کنید تا مطمئن شوید حافظه پنهان همیشه بهروز است. اگر سایت شما بیشتر محتوای ثابت دارد، بازسازی برنامه ریزی شده ممکن است کافی باشد.
کد زیر تکنیکهایی را برای بازسازی دادههای حافظه پنهان با استفاده از آن نشان میدهد wp-cron
. این نمونه:
- یک کار را برنامه ریزی می کند تا هر ساعت یک لیست از 25 شناسه پست اخیر ایجاد کند
- نتیجه را به طور نامحدود در کش شی ذخیره می کند
- زمانی که یک پست منتشر می شود فوراً به روز رسانی لیست را برنامه ریزی می کند
- هنگامی که داده ها از یک الگو در دسترس هستند، داده های پست زیرین را (معمولاً از حافظه پنهان) واکشی می کند
<?php
// on init, hook the function to the action
add_action( 'my_regenerate_posts_cron', 'my_regenerate_posts' );
// and schedule the first (optional, particularly if you are using categories)
if ( ! wp_next_scheduled( 'my_regenerate_posts_cron' ) ) {
wp_schedule_event( time(), 'hourly', 'my_regenerate_posts_cron' );
}
// action to regenerate on publish (you can also hook on transition instead)
add_action( 'publish_post', 'my_reschedule_cron_for_now' );
// scheduling function, if you are using category, then you'd need to extract that from the $post argument
function my_reschedule_cron_for_now() {
// Clear any existing hourly cron, note this needs the same args (if any) as the scheduled event if you're passing a category
wp_clear_scheduled_hook( 'my_regenerate_posts_cron' );
// Reschedule the hourly updates, initiating an immediate regeneration.
wp_schedule_event( time(), 'hourly', 'my_regenerate_posts_cron' );
}
// cron task to generate posts, it could have an optional set of params eg category
// this runs under wp_cron asynchronously
function my_regenerate_posts() {
$cache_key = 'my_cache_key'; // cache key
$some_url="http://example.com/url-with-posts/"; // URL to invalidate, optional
// Your query code here
$args = [
'posts_per_page' => 25,
'fields' => 'ids',
'post_type' => [ 'post' ],
'no_found_rows' => true,
'order' => 'DESC',
'orderby' => 'date',
];
$query = new WP_Query( $args );
// save it in a transient for a long time
wp_cache_set( $cache_key, $query->posts );
// optional for VIP Go if you have known endpoints
wpcom_vip_purge_edge_cache_for_url( $some_url );
}
// code that gets the posts - it does not attempt to query if there are no posts
// this would be called from your widget, or theme, or plugin code
function my_get_posts() {
$cache_key = 'my_cache_key'; // cache key
$posts = []; // posts array
// get the cached data. Return an error if there's no data
$ids = wp_cache_get( $cache_key );
if ( false === $posts ) {
my_reschedule_cron_for_now();
return $posts;
}
// get the underlying post data (from cache usually)
foreach ( $ids as $post_id ) {
$posts[] = get_post( $post_id );
}
return $posts;
}
این کد چندین توابع را تعریف می کند که با هم کار می کنند تا داده های ذخیره شده را بازسازی و واکشی کنند. این my_regenerate_posts()
تابع تابع اصلی است که لیستی از شناسههای پست را تولید میکند و آنها را به صورت گذرا ذخیره میکند. این my_reschedule_cron_for_now()
تابع مسئول زمانبندی مجدد است wp-cron
رویداد زمانی که یک پست منتشر می شود، اطمینان حاصل شود که حافظه پنهان بلافاصله بازسازی می شود.
استفاده از توابع VIP وردپرس برای پاک کردن کش لبه
علاوه بر استفاده wp-cron
برای بازسازی حافظه پنهان، مشتریان VIP وردپرس می توانند از کش صفحه پلتفرم VIP برای پاک کردن کش لبه برای URL های خاص در زمانی که کش باطل می شود، استفاده کنند. پلت فرم VIP به طور خودکار حافظه پنهان آدرس های اینترنتی مرتبط رایج را هنگام به روز رسانی محتوا پاک می کند. این شامل پیوند ثابت پست، صفحه اصلی، آدرسهای اینترنتی طبقهبندی برای اصطلاحات مرتبط، و آدرسهای اینترنتی فید میشود. این کار محتوای سایت شما را بدون نیاز به منتظر ماندن برای انقضای حافظه پنهان بهروز نگه میدارد، همه اینها به طور خودکار و بدون پیکربندی بیشتر.
مواردی وجود دارد که به کنترل دقیق تری نیاز است، مانند آدرس های اینترنتی که به طور خودکار پاک نمی شوند، مانند مسیرهای سفارشی. آدرسهای اینترنتی فردی را میتوان با آن شستشو داد wpcom_vip_purge_edge_cache_for_url( $url )
و لیست urlهایی که به طور خودکار فلاش می شوند را می توان با استفاده از آن تغییر داد wpcom_vip_cache_purge_{$post->post_type}_post_urls
فیلتر کنید. برای جزئیات بیشتر، لطفاً به اسناد Cache API مراجعه کنید.
یک هشدار در اینجا: تنها زمانی لازم است که انتظار برای انقضای حافظه پنهان معمولی نامناسب باشد و URL های نقطه پایانی مشخص و محدود باشند. برای کنترل TTL کش لبه یک منبع، از max-age
سرتیتر.
بهبود عملکرد وردپرس
به دنبال راه های دیگری برای بهبود عملکرد وردپرس سازمانی خود هستید؟ ما منابع بسیار خوبی برای توسعه دهندگانی داریم که می خواهند سایت های وردپرس خود را بهینه کنند.
سایت محتوا مارکتینگ
برای دیدن مطالب آموزشی بیشتر در زمینه سخت افزار و نرم افزار اینجا کلیک کنید!