کش کردن هوشمند داده‌ها در وردپرس با Transients API

در این مطلب نحوه اصولی کش‌کردن داده‌ها در وردپرس را بررسی می‌کنیم. با Transients API آشنا می‌شویم و با یک مثال نحوه استفاده عملی از آن را یاد می‌گیریم.

Transients API چیست؟

اگر برنامه نویس باشید با مفهوم کشینگ آشنا هستید و می‌دانید که برای چه از آن استفاده می‌شود در غیر اینصورت می‌توانید به این صفحه در ویکی‌پدیا مراجعه کنید و با مفهوم کشینگ و انواع آن آشنا شوید. مستندات وردپرس Transients API را به صورت زیر تعریف می‌کند:

Transients API یک روش ساده و استاندارد را برای ذخیره داده‌ها به صورت موقت در پایگاه داده با یک نام و بازه زمانی زندگی برای آن دادها، فراهم می‌کند. بعد از به پایان رسیدن زمان تعیین شده اطلاعات حذف می‌شوند و دیگر قابل دستیابی نیستند.

اگر درسایت خود به داده‌ای نیاز دارید که به ندرت به روزرسانی می‌شوند و در تهیه هر بار این داده‌ها زمان زیادی صرف می شود ولی نیازی نیست که در هربار که این اطلاعات ساخته شوند می‌توانید از Transients API برای ذخیره موقت این داده‌ها استفاده کنید تا در هر بار استفاده از این داده نیازی به تولید دوباره آن نداشته باشید. با این کار می‌توانید زمان لود صفحات را کاهش داده و درصد استفاده سایت از منابع سرور را کاهش دهید.

نحوه ذخیره و بازیابی داده‌های کش بوسیله Transients API

توابع اصلی که در هنگام ذخیره و بازیابی داده‌های مد نظر جهت کش شدن استفاده می‌کنیم توابع set_transient و get_transient هستند. تابع set_transient که از آن برای ذخیره داده کش استفاده می‌کنیم.

<?php set_transient( $transient, $value, $expiration ); ?>

این تابع سه متغیر ورودی دارد. نخست ‎$‎transient‎که نام قطعه داده‌ای است که باید کش شود. این نام در واقع شناسه یکتای آن داده است که در آینده از آن برای بازیابی داده‌های کش شده استفاده می‌کنیم. متغیر دوم ‎$value‎همان داده‌ای است که قصد کش کردن آن را داریم و از متغیر سوم یعنی ‎$expiration‎برای تعیین بازه زمانی که می‌خواهیم داده‌ها کش شوند استفاده می‌کنیم. توجه داشته باشید که مقدار این پارامتر بر حسب ثانیه است و وردپرس بعد از اتمام این زمان داده‌ها را از بانک اطلاعاتی حذف می‌کند.

زمانی که شما داده‌ای را ذخیره کردید می‌توانید به راحتی با تابع get_transient و شناسه آن داده، داده را بازیابی کنید.

<?php get_transient( $transient ); ?>

همان طور که قبل‌تر اشاره کردیم برای بازیابی داده‌ها به شناسه یکتای آن داده نیاز داریم. با ارسال این شناسه به تابع get_transient می‌توانیم به آن داده دسترسی پیدا بکنیم. این تابع دو نوع خروجی دارد. اول مقدار داده کش شده است و یا اینکه مقدار false به همین دلیل بعد از استفاده از این تابع می‌بایست بررسی کنیم که چه نوع داده‌ای در آن وجود دارد. می‌بایست در کدهای خود تمهیداتی را برای زمانی که داده‌های کش حذف شده‌اند در نظر بگیرید.

نکته ظریفی که در این قسمت وجود دارد این است که Transients API در هنگام عدم وجود داده مقدار false منطقی که با صفر مشخص می‌شود را به خروجی ارسال نمی‌کند چون این امکان وجود دارد که مقدار صفر همان داده‌ای باشد که آن را کش کرده باشید و به همین دلیل مقدار false را در یک آرایه قرار داده و آن را به خروجی ارسال می‌کند که برای تشخیص آن می‌توان از عملگر شناسایی یکتا (===) به جای عملگر برابری (==) استفاده کرد. به صورت زیر:

if ( false === ( $value = get_transient( 'value' ) ) ) {
     // this code runs when there is no valid transient set
}

حذف داده‌های کش شده بوسیله Transients API

برای حذف داده‌های کش شده از تابع delete_transient استفاده می‌کنیم که شکلی یکسان با تابع get_transient که پیش‌تر بررسی کردیم دارد با این تفاوت که این تابع با دریافت شناسه داده کش شده آن را حذف می‌کند.

<?php  delete_transient( $transient ); ?>

استفاده از Transient API در عمل

در اینجا می‌خواهیم برای شفافیت موضوع نحوه استفاده عملی از Transients API را بررسی کنیم. در این مثال می‌خواهیم داده‌های یک فید را دریافت و آنها را نمایش دهیم. دانلود این فید در هر بار نمایش و ساختن یک لیست HTML از آیتم‌های آن کار مناسبی نیست چون در هر بار دانلود و ساختن لیست خروجی آن فید زمان زیادی صرف دانلود و ساختن کد خروجی می‌شود که اینکار مخصوصا در سایت‌های پر بازدید می‌تواند باعث افت سرعت لود صفحات گردد. اما می‌خواهیم با استفاده از Transients API این فید را یکبار دانلود و برای ۲ ساعت از آن اطلاعات استفاده کنیم و پس از ۲ ساعت دوباره آن را دریافت کنیم و به همین منوال…با اضافه کردن چند خط کد می‌توان از دانلود هزاران بار این اطلاعات جلوگیری کرد. در کد زیر این کار را به صورت عملی پیاده‌سازی کرده ایم.

<?
// get data
$rss_itemslist = get_transient("wp_feed");
 
// for reading rss feed
include_once(ABSPATH . WPINC . '/feed.php');
 
// when data cached
if ($rss !== FALSE){
    // print chached feed items list
    echo $rss_itemslist;
}
// when data not cached
else{
 
    // Download feed and generate items
    $rss_itemslist = fetch_feed("http://feeds.irtuts.com/irtuts/wp");
    $max_items = $rss_itemslist->get_item_quantity(10);
    $items = $rss_itemslist->get_items(0, $max_items);
 
    // Generate HTML liat of feed items
    $fresh_list ="<ol>";
    foreach ( $items as $item )
        $fresh_list .= '<li>
          <a href="' . $item->get_link(); . '">' . $item->get_title();' .</a>
        </li>';
    $fresh_list .= '</ol>';
 
    // save fresh feed items list
    set_transient("wp_feed" , $fresh_list ,60*60*2 );
 
    // print fresh feed items list
    echo $rss_itemslist;
}
?>

در مرکز کد و در قسمت if بررسی می‌کنیم که داده‌ای از قبل در کش وجود دارد و در صورت عدم وجود در قسمت else دوباره لیست آیتم‌های آن فید را تولید می‌کنیم.

 

©2012-2013 FarsiPress All rights reserved.

Web Design by Parsian CMS, Web Hosting by Parsian Networks 2004-2013 طراحی وب با استفاده از مدیریت محتوا شبکه پارسیان, دامنه و هاستینگ توسط شبکه پارسیان 2004-2013